信号量を用いて2つのスレッドの同期問題を解決する


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 , 。