multi-thread

拖了这么久,终于才开始搞多线程。

毕设中用的算法是GA+Local Search(memetic),算法时间太长,而local search部分花费了大量的时间,于是考虑用多线程的方法来加快该步骤的计算速度。

找到一个入门教程(C++ 多线程 | 菜鸟教程 (runoob.com)),是windows平台下的多线程使用,需要包含头文件 <windows.h>,其中创建新的线程是用CreateThread(参数, ...);而C++11提供了封装线程相关操作的库,只需要包含头文件<thread>,"std::thread 变量名" 即可创建一个线程,而且是跨平台的。

看到一篇帖子讲到,临界区比互斥量快得多,因为临界区是用户态下,互斥量需要切换到核心态下。帖子如下:

(32条消息) C++11 std::thread 与 windows 运行库API _beginthreadex ;C++11 std::mutex 与 CriticalSection 的对比_chenjian60665的博客-CSDN博客

 

复制代码
  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 }
复制代码

 

posted @   山谷清芳  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示