用WaitForSingleObject()函式實現簡單的多執行緒互斥訪問
阿新 • • 發佈:2019-01-24
今天是上班第一天,寫了一個簡單的執行緒互斥訪問練習了一下多執行緒。雖然以前寫過,但現在寫還是碰到蠻多問題,比如WaitForSingleObject()函式加在哪個位置(可以用WaitForSingleObject()等待前一個執行緒結束後然後開啟下一個執行緒以此達到同步的問題,但網上看到別人的寫法線上程函式中同時也加了一道鎖。我目前的測試是二者只需要其一即可實現互斥訪問),剛開始申請了五個執行緒ID最後只顯示出了三個等等(vs2013一個完整的dos介面只能顯示300行,每個執行緒ID會列印100行數字,所以最後列印結果只有200-500)。
#include "stdafx.h"#include <iostream>
#include <windows.h>
using namespace std;
int globalV = 0 ;
HANDLE hMutex = NULL;
//每個執行緒都給全域性變數增加100
DWORD WINAPI Add(LPVOID lpParamter)
{
//在實現加法的程式碼處加鎖
hMutex = CreateMutex(NULL,TRUE,"Add");WaitForSingleObject(hMutex, INFINITE);
for(int i = 1 ; i <= 100 ; i++)
{
globalV++;
cout<<"ThreadID "<< GetCurrentThreadId()<<" globalV = "<<globalV<<endl;
}
ReleaseMutex(hMutex);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThead[5];
int i;
for (i = 0 ; i < 3 ;i++)
{
hThead[i] = CreateThread(NULL, 0, Add, NULL, 0, NULL);
cout<< GetCurrentThreadId()<<endl;
//等待前一個執行緒結束然後開啟下一個執行緒
WaitForSingleObject(hThead[i], INFINITE);CloseHandle(hThead[i]);
}
system("pause");
return 0;
}
上述方法接近於通過加鎖的方式來實現執行緒間的同步,此外還有一些其他的方法實現執行緒間的同步,下次有時間繼續進行試驗。可參考連結:http://blog.csdn.net/chexlong/article/category/947954