信号量
sem_t就是个资源计数器,用于控制访问有限共享资源的线程数。
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:创建一个信号量
sem:获取信号量的ID
pshared:一般取0即可,非0表示该信号量可以内存共享方式供多个进程使用,但Linux系统不支持。
value:信号量的初始化
int sem_wait(sem_t *sem);
功能:信号量减1,如果不能减则阻塞
int sem_trywait(sem_t *sem);
功能:尝试对信号量减1,如果不能减则立即返回
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
功能:带倒计时的对信号量减1
int sem_post(sem_t *sem);
功能:信号量加1
int sem_destroy(sem_t *sem);
功能:销毁信号量
int sem_getvalue(sem_t *sem, int *sval);
功能:获取信号量的值
举例:线程运行—用信号量来控制小毛驴的头数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
sem_t sem;
void* run(void* arg)
{
sem_wait(&sem);
int cnt;
sem_getvalue(&sem,&cnt);
printf("%lu:我骑到一头小毛驴,还剩%d头小毛驴\n",pthread_self(),cnt);
sleep(rand()%15+5);
sem_post(&sem);
sem_getvalue(&sem,&cnt);
printf("%lu:我还回一头小毛驴,还剩%d头小毛驴\n",pthread_self(),cnt);
}
int main()
{
sem_init(&sem,0,5);
printf("我有5头小毛驴\n");
pthread_t tid[10];
for(int i=0; i<10; i++)
{
pthread_create(&tid[i],NULL,run,NULL);
usleep(100);
}
for(int i=0; i<10; i++)
{
pthread_join(tid[i],NULL);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)