关于C++多线程实例
引用自https://www.cnblogs.com/codingmengmeng/p/5913068.html的C++多线程入门实例
首先是最初实例代码:
#include <iostream>
#include <windows.h>
using namespace std;
DWORD WINAPI Fun(LPVOID lpParamter) //自定义线程
{
for (int i = 0; i < 10; i++) //定义执行次数
cout << "A Thread Fun Display!" << endl; //定义输出内容
return 0L;
}
int main() //主线程
{
HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);
CloseHandle(hThread);
for (int i = 0; i < 10; i++) //执行次数
cout << "Main Thread Display!" << endl;
return 0;
}
运行结果如下:
从代码运行结果来看,主线程(main函数)和我们自己的线程(Fun函数)是随机交替执行的,同时从第二次运行结果会发现一个问题,即"A Thread Fun Display!"并没有输出达到十次,也就是说我们自定义的函数并没有执行足够的次数。这是因为主线程运行完之后将所占资源都释放掉了,使得子线程还没有运行完。
同时,我们会发现一个现象,即在输出结果上,换行操作执行的很凌乱没规律,理论上讲应该是一次输出一次换行,然而这里出现了不换行和连续换行的现象。
用我们学过的知识可以来解释:把屏幕看成是一个资源,这个资源被两个线程所共用,加入当Fun函数输出了Fun Display!后,将要输出endl,但此时,main函数却得到了运行的机会,此时Fun函数还没有来得及输出换行(时间片用完),就把CPU让给了main函数,而这时main函数就直接在Fun Display!后输出Main Display!。
另一种情况就是“输出两个换行”,这种情况就是比如输出Main Display!并输出endl后,时间片用完,轮到子线程占用CPU,子进程上一次时间片用完时停在了Fun Display!,下一次时间片过来时,刚好开始输出endl,此时就会“输出两个换行”。
那么,想要实现正常的输出情况,就可以用互斥来解决。
实例代码2:
#include <iostream>
#include <windows.h>
using namespace std;
HANDLE hMutex = NULL; //互斥信号量
DWORD WINAPI Fun(LPVOID lpParamter) //线程函数
{
for (int i = 0; i < 10; i++) //定义输出次数
{
//请求一个互斥信号量
WaitForSingleObject(hMutex, INFINITE);
cout << "A Thread Fun Display!" << endl;
Sleep(100);
//释放互斥量锁
ReleaseMutex(hMutex);
}
return 0L;//表示返回的是long型的0
}
int main()
{
//创建一个子线程
HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);
hMutex = CreateMutex(NULL, FALSE,"screen");
//关闭线程
CloseHandle(hThread);
//主线程的执行路径
for (int i = 0; i < 10; i++)
{
//请求获得一个互斥信号量
WaitForSingleObject(hMutex,INFINITE);
cout << "Main Thread Display!" << endl;
Sleep(100);
//释放互斥信号量
ReleaseMutex(hMutex);
}
return 0;
}
代码实现: