用WaitForSingleObject()函数实现简单的多线程互斥访问

今天是上班第一天,写了一个简单的线程互斥访问练习了一下多线程。虽然以前写过,但现在写还是碰到蛮多问题,比如WaitForSingleObject()函数加在哪个位置(可以用WaitForSingleObject()等待前一个线程结束后然后开启下一个线程以此达到同步的问题,但网上看到别人的写法在线程函数中同时也加了一道锁。我目前的测试是二者只需要其一即可实现互斥访问),刚开始申请了五个线程ID最后只显示出了三个等等(vs2013一个完整的dos界面只能显示300行,每个线程ID会打印100行数字,所以最后打印结果只有200-500)。

#include "stdafx.h"
#include <iostream>   
#include <windows.h> 

using namespace std;

int globalV = 0 ;

HANDLE hMutex = NULL;

//每个线程都给全局变量增加100
DWORD WINAPI Add(LPVOID lpParamter)

{

//在实现加法的代码处加锁

hMutex = CreateMutex(NULL,TRUE,"Add");
WaitForSingleObject(hMutex, INFINITE);
for(int i = 1 ; i <= 100 ; i++)
{
globalV++;
cout<<"ThreadID  "<< GetCurrentThreadId()<<"    globalV = "<<globalV<<endl;
}
ReleaseMutex(hMutex);
return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{


HANDLE hThead[5];
int i;
for (i = 0 ; i < 3 ;i++)
{
hThead[i] = CreateThread(NULL, 0, Add, NULL, 0, NULL);

cout<< GetCurrentThreadId()<<endl;

//等待前一个线程结束然后开启下一个线程

WaitForSingleObject(hThead[i], INFINITE);
CloseHandle(hThead[i]);
}
system("pause");

return 0;
}
上述方法接近于通过加锁的方式来实现线程间的同步,此外还有一些其他的方法实现线程间的同步,下次有时间继续进行试验。可参考链接:http://blog.csdn.net/chexlong/article/category/947954
阅读更多
文章标签: 多线程 C++
个人分类: c/c++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭