多執行緒資料同步問題
阿新 • • 發佈:2019-01-09
在多執行緒程式設計中執行緒的執行沒有先後順序,有的時候需要對資料按照一定的順序進行執行,執行的方式有臨界區(Critiacal section),互斥量(mutex),事件(event),訊號量(semaphsore)等方式可以實現,但互斥量會初始化一系列資源,通常不作為資料哦同步的方式。
在不行資料同步的情況下,程式碼和執行結果如下`:
#include<Windows.h> #include<process.h> #include<iostream> using namespace std; HANDLE hEvent{ 0 }; int m = 0; unsigned int StartAddress(void* ) { while (true) { cout << "Second thread"<<(++m )<< endl; } return 0; } int main() { unsigned ThrdAddr = 0; uintptr_t hThread{ 0 }; hEvent = CreateEvent(nullptr, false, false, ""); hThread = _beginthreadex(nullptr,0, (_beginthreadex_proc_type)StartAddress,nullptr,false, &ThrdAddr); while (true) { cout << "Main thread" << (++m) << endl; } return system("pause"); } ![非資料同步](https://img-blog.csdnimg.cn/20181228134358272.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3Nzc0MzA0,size_16,color_FFFFFF,t_70) 進行資料同步之後的程式碼: #include<Windows.h> #include<process.h> #include<iostream> using namespace std; HANDLE hEvent{ 0 }; int m = 0; unsigned int StartAddress(void* ) { while (true) { DWORD bFlag = WaitForSingleObject(hEvent, 30); if (bFlag == WAIT_OBJECT_0) { cout << "Second thread"<<(++m )<< endl; ResetEvent(hEvent); Sleep(5); } } return 0; } int main() { unsigned ThrdAddr = 0; uintptr_t hThread{ 0 }; hEvent = CreateEvent(nullptr, false, false, ""); hThread = _beginthreadex(nullptr,0, (_beginthreadex_proc_type)StartAddress,nullptr,false, &ThrdAddr); while (true) { cout << "Main thread" << (++m) << endl; SetEvent(hEvent); Sleep(5); } return system("pause"); }