使用信号量解决两个线程同步问题
2017-01-26 16:21
169 查看
1.同步问题
我们知道多道程序设计理念的提出,使得线程(进程)和线程(进程)之间可以并发执行,但是有一些特殊的情况,请看下面的例子: (https://img-blog.csdn.net/20170126160159642?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM2NTA5Nzg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 这就引发了同步问题。
2.解决思路
我们采用信号量的方式解决该同步问题,即当线程B执行之前一直等待线程A发出的信号,一旦接收到线程A的信号,线程B挂入就绪队列准备执行,否则线程B一直挂在对应信号量的等待队列。3.代码模拟
我们创建两个线程A和B,创建后使其挂起。然后设置信号量value初始值为0。先Resume B并在其之前设置等待命令,再Resume A并在其之后设置发出信号命令:#include "stdafx.h" #include"stdio.h" #include "stdlib.h" #include "windows.h" void init(){ int i; for(i=0;i<3;i++){ lock[i]=0; number[i]=0; } } void wait(int *value,HANDLE w){ (*value)--; if((*value)<0){ SuspendThread(w); } } void signal(int *value,HANDLE w){ (*value)++; if((*value)<=0){ ResumeThread(w); } } DWORD WINAPI AThread(LPVOID lpParameter){ printf("线程A正在运行\n"); return 0; } DWORD WINAPI BThread(LPVOID lpParameter){ printf("线程B正在运行\n"); return 0; } int main(){ HANDLE A,B; int S=0; //设置信号量初始值 init(); B=CreateThread(NULL,NULL,BThread,0,CREATE_SUSPENDED,NULL); A=CreateThread(NULL,NULL,AThread,0,CREATE_SUSPENDED,NULL); wait(&S,B); ResumeThread(B); ResumeThread(A); signal(&S,B); system("pause"); return 0; }
这样即使cpu先调度Thread B,B也会因为未收到A的信号,从而挂起。
相关文章推荐
- 滴水穿石--使用VC6.0碰到的两个问题及其解决方法
- 使用map遇到的两个问题及解决办法
- 使用信号量解决读者写者问题--写者优先
- 关于Struts2使用redirectAction方式在两个Action之间传值时中文乱码问题的解决方法
- 信号量解决经典线程同步问题
- 使用三种算法解决从键盘输入两个整数,输出两个整数的最大公约数的问题
- 关于 Fiddler 使用的两个常见问题的解决视频
- 使用信号量解决读者写者问题--写者优先
- 网络受限下,使用Nexus要解决的两个问题
- 1,使用信号量解决生产者-消费者问题
- [Android]使用 Eclipse 给 APK 签名时遇到的两个问题及解决办法
- unp2 08 使用信号量解决哲学家就餐问题
- 树莓派研究:使用蓝牙的两个问题的解决
- ObjectARX中使用非模态对话框遇到的两个问题及解决办法
- FckEditor使用时遇到的两个问题,未能加载xxxx和上传图片无响应的解决方法
- weblogic 12c下使用hadoop时jar包冲突的两个问题的解决办法
- 信号量解决经典线程同步问题
- ueditor使用过程中的两个问题以及解决方法
- 使用COM的解决1是什么2在哪里这两个问题
- 使用信号量解决读者写者问题--读者优先