关闭

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

标签: 多线程C++
278人阅读 评论(0) 收藏 举报
分类:

今天是上班第一天,写了一个简单的线程互斥访问练习了一下多线程。虽然以前写过,但现在写还是碰到蛮多问题,比如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
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:280次
    • 积分:15
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档