sem_t的初始化信号量

sem_t的初始化信号量,第1张

它的原型为: 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)

}

sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享。

sem_wait:一直阻塞等待直到信号量>0。

sem_timedwait:阻塞等待若干时间直到信号量>0。

sem_post:使信号量加1。

sem_destroy:释放信号量。和sem_init对应。 答案补充 关于各函数的具体参数请用man查看,如man sem_init可查看该函数的帮助

信号量的工作原理

由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:

P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行

V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

举个例子,就是两个进程共享信号量sv,一旦其中一个进程执行了P(sv)操作,它将得到信号量,并可以进入临界区,使sv减1。而第二个进程将被阻止进入临界区,因为当它试图执行P(sv)时,sv为0,它会被挂起以等待第一个进程离开临界区域并执行V(sv)释放信号量,这时第二个进程就可以恢复执行。

Linux的信号量机制

Linux提供了一组精心设计的信号量接口来对信号进行操作,它们不只是针对二进制信号量,下面将会对这些函数进行介绍,但请注意,这些函数都是用来对成组的信号量值进行操作的。它们声明在头文件sys/sem.h中。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/213850.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-05
下一篇2023-04-05

发表评论

登录后才能评论

评论列表(0条)

    保存