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

原创 2015年07月09日 14:27:39

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

函数的原型: DWORD WaitForSingleObject( HANDLE hHandle, // handle to object DWORD dwMilliseconds // time-...
  • richerg85
  • richerg85
  • 2012年03月14日 18:29
  • 6916

WaitForSingleObject的用法-(判断一个程序是否结束)

WaitForSingleObject 的应用   你还再为怎么判断一个程序是否结束而苦恼吗?或许你在想可以用一个循环每隔几秒来判断一次这个进程是否结束,但是这样会有问题,如果间隔时间太短就会很占...
  • Iamduoluo
  • Iamduoluo
  • 2011年08月17日 10:16
  • 8713

【C++】WaitForSingleObject函数的使用&&WaitForSingleObject和CEvent用法

WaitForSingleObject 当指定的对象处于有信号状态或者等待时间结束的状态时,此函数返回。 DWORD WaitForSingleObject(   HANDLE hHandle,...
  • ly930156123
  • ly930156123
  • 2017年02月23日 11:12
  • 530

内核对象和线程同步—WaitForSingleObject

WaitForSingleObject        当进程正在运行的时候,进程内核对象处于未通知状态,当进程终止运行的时候,它就变为已通知状态。进程内核对象中是个布尔值,当对象创建...
  • fzuim
  • fzuim
  • 2016年08月24日 14:06
  • 515

WaitForSingleObject()函数、WaitForMultipleObject()函数

在多线程下面,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjec...
  • xiaobai1593
  • xiaobai1593
  • 2011年08月09日 13:49
  • 29477

mutex 与 WaitForSingleObject

WaitForSingleObject的函数原型为: WINBASEAPI DWORD WINAPI WaitForSingleObject( __in HANDLE hHandle, ...
  • HEVC_CJL
  • HEVC_CJL
  • 2013年10月03日 19:55
  • 5814

WaitForSingleObject 的内部实现原理

WaitForSingleObject 是 kernel32.dll 的导出函数,WaitForSingleObject 调用了ntdll.dll 的 NtWaitForSingleObject. N...
  • markqian86
  • markqian86
  • 2009年02月09日 15:32
  • 1176

多线程中sleep与WaitForSingleObject的区别?

sleep不延迟时线程不会交出所有权,而WaitForSingleObject会,因此WaitForSingleObject比较彻底,效率更高。 哪位大虾有相关资料,发来研究研究。 大虾们多多讨论...
  • lzg13541043726
  • lzg13541043726
  • 2015年01月13日 10:04
  • 2037

线程句柄作WaitForSingleObject的参数是什么意思?

[cpp] view plaincopy #include    #include       DWORD WINAPI Fun1Proc(LPVOID lpPar...
  • L_Andy
  • L_Andy
  • 2015年01月28日 11:22
  • 1090

C++多线程同步之Mutex(互斥量)

一、互斥量Mutex同步多线程1、Win32平台相关函数和头文件#include HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes...
  • oLanSeFengYe1
  • oLanSeFengYe1
  • 2016年11月16日 15:06
  • 1292
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用WaitForSingleObject()函数实现简单的多线程互斥访问
举报原因:
原因补充:

(最多只允许输入30个字)