多线程sem_init

用下面一组函数(系统调用)来实现。
int sem_init(sem_t *sem,int pshared,unsigned int value); 
int sem_destroy(sem_t *sem); 
int sem_wait(sem_t *sem); 
int sem_trywait(sem_t *sem); 
int sem_post(sem_t *sem); 
int sem_getvalue(sem_t *sem); 
具体要Include什么头文件,在你的系统上man sem_init吧。
这组函数是POSIX标准的无名信号量函数,另外还有具名信号亮,这个嘛,等下回再说。
  第一个参数:信号量名
看一个例子,比如有两个线程都要往打印机上打东西,但是同一时刻只能打一个。
那么首先用sem_init初始化一个信号量,注意 pshared表 示允许几个进程共享该信号量,一般设0用于进程内的多线程共享,要看是否支持进程共享,请查看下你的系统的man手册。
第三个参数value表示可用的资源的数目 ,即信号灯的数目,咱们这儿只有1个打印机所以设成1。
然后线程调用sem_wait取获取这个信号灯,第一个线程一看,有1个,他就拿到了,然后可以继续后继操作,此时信号灯自动减1,变成0个。那么第二个线程调用sem_wait时就会阻塞在这儿了。
第一个线程完成打印后,调用sem_post释放信号灯,信号灯数目变成1,将会唤醒等待的第二个线程,然后第二个线程接着打印。
最后当所有任务完成后,主线程调用sem_destroy释放这个信号量。
`sem_init` 是 POSIX 线程(pthread)库提供的一个函数,用于初始化一个信号量。信号量是一种用于多线程同步的机制,它可以用来控制对共享资源的访问。`sem_init` 函数的原型如下: ```c int sem_init(sem_t *sem, int pshared, unsigned int value); ``` 参数说明: - `sem`: 指向信号量对象的指针。 - `pshared`: 如果此标志为非零值,信号量将在进程间共享;如果为零,则只在调用 `sem_init` 的进程内共享。 - `value`: 信号量的初始值。 段错误(segmentation fault)通常是由于程序试图访问其内存空间中未分配或不允许访问的内存区域时发生的错误。`sem_init` 导致段错误可能有以下几种原因: 1. 传递给 `sem_init` 的 `sem` 参数可能指向了一个非法或未初始化的内存区域。确保在调用 `sem_init` 之前,`sem` 已经被正确地分配了内存,并且不是野指针。 2. 如果在多线程环境中使用 `sem_init`,确保在调用 `sem_init` 之前没有其他线程正在使用该信号量对象。如果信号量对象是在进程间共享的,那么在调用 `sem_init` 之前,应该保证该对象没有被其他进程初始化过。 3. 确保在使用 `sem_init` 时,程序有足够的权限来访问和初始化信号量对象。 4. 在某些特定的操作系统或系统配置中,可能存在特定的限制或要求,需要仔细检查文档或进行调试。 要解决 `sem_init` 导致的段错误,需要检查程序中所有相关代码,确保信号量对象在使用前已经被正确地分配和初始化,并且不存在线程安全问题或其他资源竞争的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值