multi-thread
拖了这么久,终于才开始搞多线程。
毕设中用的算法是GA+Local Search(memetic),算法时间太长,而local search部分花费了大量的时间,于是考虑用多线程的方法来加快该步骤的计算速度。
找到一个入门教程(C++ 多线程 | 菜鸟教程 (runoob.com)),是windows平台下的多线程使用,需要包含头文件 <windows.h>,其中创建新的线程是用CreateThread(参数, ...);而C++11提供了封装线程相关操作的库,只需要包含头文件<thread>,"std::thread 变量名" 即可创建一个线程,而且是跨平台的。
看到一篇帖子讲到,临界区比互斥量快得多,因为临界区是用户态下,互斥量需要切换到核心态下。帖子如下:
1 #include <windows.h> 2 #include <iostream> 3 #include <omp.h> 4 #include<mutex> 5 #include<thread> 6 #include <ctime> 7 8 using namespace std; 9 10 #define NAME_LINE 40 11 12 mutex mtx; 13 volatile clock_t startt, endt; 14 15 // 定义线程函数传入参数的结构体 16 typedef struct _THREAD_DATA 17 { 18 int nMaxNum; 19 char strThreadName[NAME_LINE]; 20 21 _THREAD_DATA() : nMaxNum(0) 22 { 23 memset(strThreadName, 0, NAME_LINE * sizeof(char)); 24 } 25 26 } THREAD_DATA; 27 28 HANDLE g_hMutex = NULL; // 互斥量 29 30 void mysleep() { 31 Sleep(1000); 32 } 33 34 // 线程函数 35 DWORD WINAPI ThreadProc(LPVOID lpParameter) { 36 THREAD_DATA* pThreadData = (THREAD_DATA*)lpParameter; 37 38 for (int i = 0; i < pThreadData->nMaxNum; ++i) { 39 // 请求获得一个互斥量锁 40 //WaitForSingleObject(g_hMutex, INFINITE); 41 cout << pThreadData->strThreadName<<"---" << i <<endl; 42 mysleep(); 43 // 释放互斥量锁 44 //ReleaseMutex(g_hMutex); 45 } 46 endt = clock(); 47 double endtime = (double)(endt - startt) / CLOCKS_PER_SEC; 48 49 cout << "Total time:" << endtime << endl; //s为单位 50 //cout << "Total time:" << endtime * 1000 << "ms" << endl; //ms为单位 51 52 return 0L; 53 } 54 55 int main() 56 { 57 58 // 创建一个互斥量 59 g_hMutex = CreateMutex(NULL, FALSE, NULL); 60 61 mtx.try_lock(); 62 startt = clock(); 63 64 // pragma omp parallel for 65 // 66 // 初始化线程数据 67 THREAD_DATA threadData1, threadData2, threadData3, threadData4; 68 threadData1.nMaxNum = 10; 69 strcpy_s(threadData1.strThreadName, "线程1"); 70 threadData2.nMaxNum = 10; 71 strcpy_s(threadData2.strThreadName, "线程2"); 72 threadData3.nMaxNum = 10; 73 strcpy_s(threadData3.strThreadName, "线程3"); 74 threadData4.nMaxNum = 10; 75 strcpy_s(threadData4.strThreadName, "线程4"); 76 77 THREAD_DATA threadData5, threadData6, threadData7, threadData8, threadData9; 78 threadData5.nMaxNum = 10; 79 strcpy_s(threadData5.strThreadName, "线程5"); 80 threadData6.nMaxNum = 10; 81 strcpy_s(threadData6.strThreadName, "线程6"); 82 threadData7.nMaxNum = 10; 83 strcpy_s(threadData7.strThreadName, "线程7"); 84 threadData8.nMaxNum = 10; 85 strcpy_s(threadData8.strThreadName, "线程8"); 86 threadData9.nMaxNum = 10; 87 strcpy_s(threadData9.strThreadName, "线程9"); 88 89 //主线程的执行路径 90 // 创建第一个子线程 91 HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc, &threadData1, 0, NULL); 92 // 创建第二个子线程 93 HANDLE hThread2 = CreateThread(NULL, 0, ThreadProc, &threadData2, 0, NULL); 94 // 创建第三个子线程 95 HANDLE hThread3 = CreateThread(NULL, 0, ThreadProc, &threadData3, 0, NULL); 96 // 创建第三个子线程 97 HANDLE hThread4 = CreateThread(NULL, 0, ThreadProc, &threadData4, 0, NULL); 98 99 // 创建第一个子线程 100 HANDLE hThread5 = CreateThread(NULL, 0, ThreadProc, &threadData5, 0, NULL); 101 // 创建第二个子线程 102 HANDLE hThread6 = CreateThread(NULL, 0, ThreadProc, &threadData6, 0, NULL); 103 // 创建第三个子线程 104 HANDLE hThread7 = CreateThread(NULL, 0, ThreadProc, &threadData7, 0, NULL); 105 // 创建第三个子线程 106 HANDLE hThread8 = CreateThread(NULL, 0, ThreadProc, &threadData8, 0, NULL); 107 // 创建第三个子线程 108 HANDLE hThread9 = CreateThread(NULL, 0, ThreadProc, &threadData9, 0, NULL); 109 110 // 关闭线程 111 CloseHandle(hThread1); 112 CloseHandle(hThread2); 113 CloseHandle(hThread3); 114 CloseHandle(hThread4); 115 CloseHandle(hThread5); 116 CloseHandle(hThread6); 117 CloseHandle(hThread7); 118 CloseHandle(hThread8); 119 CloseHandle(hThread9); 120 121 /* 122 //主线程的执行路径 123 for (int i = 0; i < 5; ++i) { 124 // 请求获得一个互斥量 125 WaitForSingleObject(g_hMutex, INFINITE); 126 cout << "主线程===" << i << endl; 127 Sleep(100); 128 // 释放互斥量锁 129 ReleaseMutex(g_hMutex); 130 } 131 */ 132 133 mtx.unlock(); 134 endt = clock(); 135 double endtime = (double)(endt - startt) / CLOCKS_PER_SEC; 136 137 cout << "Total time:" << endtime << endl; //s为单位 138 cout << "Total time:" << endtime * 1000 << "ms" << endl; //ms为单位 139 140 system("pause"); 141 142 return 0; 143 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?