信号量を用いて2つのスレッドの同期問題を解決する
3008 ワード
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.コードシミュレーション
2つのスレッド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
");
return 0;
}
DWORD WINAPI BThread(LPVOID lpParameter){
printf(" B
");
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 , 。