线程同步——信号量
来源:互联网 发布:mac keynote 模板 编辑:程序博客网 时间:2024/06/05 21:13
看一个例子,比如有两个线程都要往打印机上打东西,但是同一时刻只能打一个。
那么首先用sem_init初始化一个信号量,注意pshared表示允许几个进程共享该信号量,一般设0用于进程内的多线程共享,要看是否支持进程共享,请查看下你的系统的man手册。
第三个参数value表示可用的资源的数目,即信号灯的数目,咱们这儿只有1个打印机所以设成1。
然后线程调用sem_wait取获取这个信号灯,第一个线程一看,有1个,他就拿到了,然后可以继续后继操作,此时信号灯自动减1,变成0个。那么第二个线程调用sem_wait时就会阻塞在这儿了。
第一个线程完成打印后,调用sem_post释放信号灯,信号灯数目变成1,将会唤醒等待的第二个线程,然后第二个线程接着打印。
最后当所有任务完成后,主线程调用sem_destroy释放这个信号量。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>#include <pthread.h>
#include <semaphore.h>
int myglobal;
sem_t sem;
void * thread_function(void *arg)
{
int i,j;
for (i = 0; i < 10; i += 1)
{
sem_wait(&sem);
j = myglobal;
j = j+1;
printf(".");
fflush(stdout);
sleep(1);
myglobal = j;
sem_post(&sem);
}
return NULL;
}
int main(void)
{
pthread_t mythread;
int i;
sem_init(&sem, 0, 1);//信号量初始化
if(pthread_create(&mythread, NULL, thread_function, NULL))
{
printf("create thread error!\n");
abort();
}
/* sleep(1);*/
for(i = 0; i < 10; i++)
{
sem_wait(&sem);//=0
myglobal = myglobal + 1;
printf("o");
fflush(stdout);
sleep(1);
sem_post(&sem);//=1
}
if(pthread_join(mythread, NULL))
{
printf("waiting thread failed!\n");
abort();
}
printf("myglobal equals %d\n",myglobal);
exit(0);
}
0 0
- 线程同步——信号量
- 线程同步——信号量
- 线程同步——信号量
- 线程同步——信号量
- 线程同步—信号量(闭环控制)
- Windows线程同步——信号量对象
- 线程同步—条件变量和信号量
- 多线程开发学习笔记之线程同步——信号量
- 线程同步——临界区,互斥量,信号量,事件
- Linux多线程——使用信号量同步线程
- 线程与同步之三——信号量
- Linux多线程——使用信号量同步线程
- Linux多线程——使用信号量同步线程
- Linux多线程——使用信号量同步线程
- Linux多线程——使用信号量同步线程
- Linux多线程——使用信号量同步线程
- 进程、线程同步互斥学习 —— 信号量
- Linux多线程——使用信号量同步线程
- TableLayoutPanel删除行
- SQL 基础:Select语句,各种join,union用法
- This application is modifying the autolayout engine from a background thread...
- 10.DNS服务器搭建
- How to deal with the error message "Could not load SAPGUIResources"
- 线程同步——信号量
- 操作系统---基础题目汇总十一
- AppleStore下载量查看
- leetcode:231 Power of Two-每日编程第十八题
- UITextField判断用户输入是否为邮箱
- elasticsearch 离线安装head,bigdesk插件
- 怎样正确做 Web 应用的压力测试
- 【android_温故知新】各种杂项组件
- 无法启动此程序,因为计算机中丢失VCRUNTIME140.dll 尝试重新安装此程序以解决此问题