线程同步--信号量
来源:互联网 发布:安卓微信语音导出软件 编辑:程序博客网 时间:2024/06/05 11:17
线程同步方法 信号量不常用,找到个帖子不错,记录一下!
依赖的头文件
#include <semaphore.h>
函数声明
sem_t表示信号量
int sem_init(sem_t *sem, int pshared,unsigned int value);
名称:
sem_init
功能:
initialize an unnamed semaphore,初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享。
头文件:
#include <semaphore.h>
函数原形:
int sem_init(sem_t *sem, int pshared, unsigned int value);
参数:
返回值:
sem_init() returns 0 on success; on error, -1 is returned, and errno is set to indicate the error.
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
名称:
sem_wait
sem_trywait
功能:
lock a semaphore 一直阻塞等待直到信号量 > 0.
头文件:
#include <semaphore.h>
函数原形:
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
参数:
返回值:
All of these functions return 0 on success; on error, the value of the semaphore is left unchanged, -1 is returned, and errno is set to indicate the error.
int sem_timedwait(sem_t *sem, const structtimespec *abs_timeout);
名称:
sem_timedwait
功能:
lock a semaphore,阻塞等待若干时间直到信号量 > 0
头文件:
#include <semaphore.h>
函数原形:
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
参数:
返回值:
All of these functions return 0 on success; on error, the value of the semaphore is left unchanged, -1 is returned, and errno is set to indicate the error.
int sem_post(sem_t *sem);
名称:
sem_post
功能:
unlock a semaphore,使信号量加1。
头文件:
#include <semaphore.h>
函数原形:
int sem_post(sem_t *sem);
参数:
返回值:
sem_post() returns 0 on success; on error, the value of the semaphore is left unchanged, -1 is returned, and errno is set to indicate the error.
int sem_destroy(sem_t *sem);
名称:
sem_destroy
功能:
destroy an unnamed semaphore释放信号量。和sem_init对应
头文件:
#include <semaphore.h>
函数原形:
int sem_destroy(sem_t *sem);
参数:
返回值:
sem_destroy() return 0 on success;on error,-1 is returned,an errno is set to indicate the error.
案例说明:
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#define NUM 5
int queue[NUM];
sem_t blank_number,product_number;
void *producer(void *arg)
{
int p = 0;
while(1) {
//blank_num = 5生产者最多生产5个
//一直阻塞等待信号量大于0
sem_wait(&blank_number);
queue[p] = rand() % 1000 + 1;
printf("Produce %d\n",queue[p]);
//product_number = 0 ->1
//使信号量加1
sem_post(&product_number);
p = (p + 1) % NUM;
sleep(rand() % 5);
}
}
void *consumer(void *arg) {
int c = 0;
while (1) {
//等待信号量大于0
sem_wait(&product_number);
printf("Consume %d\n",queue[c]);
queue[c] = 0;
//使信号量加1
sem_post(&blank_number);
c = (c + 1) % NUM;
sleep(rand() % 5);
}
}
int main(int argc ,char *argv[])
{
pthread_t pid,cid;
//将blank_num信号量初始化的值为5
sem_init(&blank_number,0,NUM);
//将product_number信号量初始化的值变为0
sem_init(&product_number,0,0);
pthread_create(&pid,NULL,producer,NULL);
pthread_create(&cid,NULL,consumer,NULL);
pthread_join(pid,NULL);
pthread_join(cid,NULL);
sem_destroy(&blank_number);
sem_destroy(&product_number);
return 0;
}
运行结果:
- JAVA 线程 同步 信号量
- JAVA 线程 同步 信号量
- 线程信号量同步
- 线程同步之信号量
- 线程同步-信号量
- 线程同步----信号量(Semaphore)
- 线程的同步--信号量
- delphi 信号量线程同步
- 线程同步--使用信号量
- 线程同步(信号量)
- 信号量实现线程同步
- 4线程同步:信号量
- 信号量---线程同步
- 线程同步----信号量(Semaphore)
- 线程同步:信号量
- 线程同步之信号量
- 信号量---线程同步
- linux 线程同步 信号量
- Java注解Annotation基础
- html的meta总结,html标签中meta属性使用介绍
- mysql无法插入中文以及查询无法显示中文
- (一)、初识C语言
- 装箱问题-ssl 1014
- 线程同步--信号量
- 【caffe源码研究】第一章:安装篇(中): Windows版
- ubuntu系统-博客之前笔记
- Linux下配置环境变量
- md5加密算法
- Ngrok
- 黑白棋子的移动(normal) ssl 1310
- SSH免密码登录
- window.location方法