C++多執行緒的一些理解
阿新 • • 發佈:2018-12-12
C++多執行緒程式設計有多種方法,傳統方法稍微繁瑣,不易理解,現給出一demo示例,說明執行同一任務達到並行執行的效果,從而提高程式效率。
#include <iostream> #include <Windows.h> #include "opencv2/opencv.hpp" using namespace std; using namespace cv; HANDLE hObject; // 傳遞執行緒引數的結構體 typedef struct threadParams { int a; int b; }threadParams; DWORD WINAPI Fun(LPVOID lps)//建立多執行緒函式,函式返回值為DWORD WINAPI,一定要是這個,否則會出錯 { threadParams *mydata = (threadParams*)lps; while (true) { Sleep(2000); WaitForSingleObject(hObject, INFINITE);//獲取等待資源,一直等待,知道獲取"screen"資源後,才返回 cout << mydata->a << "," << mydata->b << endl; //cout << "支執行緒1" << endl; SetEvent(hObject); } } DWORD WINAPI Fun1(LPVOID lps) { threadParams *mydata = (threadParams*)lps; while (true) { WaitForSingleObject(hObject, INFINITE);//獲取等待資源,一直等待,直到有訊號後,才執行下面語句 //cout << "支執行緒1" << endl; cout << mydata->a << "," << mydata->b << endl; //Sleep(2000); SetEvent(hObject); } } DWORD WINAPI Fun2(LPVOID lps) { threadParams *mydata = (threadParams*)lps; while (true) { WaitForSingleObject(hObject, INFINITE);//獲取等待資源,一直等待,直到有訊號後,才執行下面語句 //cout << "支執行緒1" << endl; cout << mydata->a << "," << mydata->b << endl; //Sleep(2000); SetEvent(hObject); } } int main() { threadParams parms[3] = {1,2,3,4,5,6}; HANDLE handle1 = CreateThread(NULL, 0, Fun, &parms[0], 0, NULL);//建立多執行緒 HANDLE handle2 = CreateThread(NULL, 0, Fun, &parms[1], 0, NULL);//建立多執行緒 HANDLE handle3 = CreateThread(NULL, 0, Fun, &parms[2], 0, NULL);//建立多執行緒 HANDLE handales[3] = { handle1,handle2,handle3 }; hObject = CreateEvent(NULL, false, false, NULL); SetEvent(hObject); CloseHandle(handle1);//釋放執行緒 CloseHandle(handle2);//釋放執行緒 CloseHandle(handle3);//釋放執行緒 while (true) { double time1 = getTickCount(); WaitForSingleObject(hObject, INFINITE);//獲取等待資源,一直等待,知道獲取"screen"資源後,才返回 Sleep(500); cout << "主執行緒1" << endl; printf("take time(ms)%.2f\n", (getTickCount() - time1) / getTickFrequency() * 1000); SetEvent(hObject); } CloseHandle(hObject); return 0; }
可以看出,三個“任務”是同時隔2000ms同步一次。
Reference
https ://blog.csdn.net/naibozhuan3744/article/details/78746292?utm_source=copy