它的原型为: extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value))
头文件为: #include <semaphore.h>
sem为指向信号量结构的一个指针;
pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;
value给出了信号量的初始值。
函数sem_post( sem_t *sem )用来增加信号量的值当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不再阻塞,选择机制同样是由线程的调度策略决定的。
函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。
函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem的值减一。
函数sem_destroy(sem_t *sem)用来释放信号量sem。
#include<stdio.h>#include<pthread.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<semaphore.h>
#include<stdlib.h>
#define N 3
pthread_mutex_t mutex_w,mutex_r// 定义读写互斥锁
sem_t sem_w,sem_r//定义读写信号量
int data[N]
int pos=0
void *function_w(void *arg)
{
int w = *(int *)arg
pos = w
while(1)
{
usleep(100000)
sem_wait(&sem_w)//等待可写的资源
pthread_mutex_lock(&mutex_w)//禁止别的线程写此资源
data[pos] = w
w++
w++
w++
pos++
pos=pos%N
pthread_mutex_unlock(&mutex_w)//别的线程可写此资源
sem_post(&sem_r)// 释放一个读资源
}
return (void *)0
}
void *function_r(void *arg)
{
while(1)
{
sem_wait(&sem_r)//等待可读的资源
pthread_mutex_lock(&mutex_r)//禁止别的线程读此资源
printf("%d\n",data[(pos+N-1)%N])
pthread_mutex_unlock(&mutex_r)//别的线程可读此资源
sem_post(&sem_w)// 释放一个写资源
}
return (void *)0
}
int main(int argc, char **argv)
{
pthread_t thread[2*N]
int i
pthread_mutex_init(&mutex_w,NULL)
pthread_mutex_init(&mutex_r,NULL)
sem_init(&sem_w,0,N)
sem_init(&sem_r,0,0)
for(i=0i<Ni++)
{
if ( pthread_create(&thread[i],NULL,function_w,(void *)&i) <0)//创建写线程
{
perror("pthread_create")
exit(-1)
}
}
for(i=Ni<2*Ni++)
{
if ( pthread_create(&thread[i],NULL,function_r,NULL) <0)//创建读线程
{
perror("pthread_create")
exit(-1)
}
}
sleep(1)
return(0)
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)