用WaitForSingleObject()函数实现简单的多线程互斥访问
2015-07-09 14:27
507 查看
今天是上班第一天,写了一个简单的线程互斥访问练习了一下多线程。虽然以前写过,但现在写还是碰到蛮多问题,比如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
#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
相关文章推荐
- Object转换为JSON格式字符串
- object-单例设计模式
- [Objective-C] alloc和init要嵌套写而不要分开写
- objective C中的浅复制和深复制
- [Objective-C] isKindOfClass 和 class 方法
- 托管态update更新异常——a different object with the same identifier value was already associated withthe sess
- [Objective-C] 重载objectAtIndexedSubscript和objectForKeyedSubscript方法实现subscripting
- value equality vs. object equality, aliasing, list is mutable DEMO
- Objective-C和 C++ 混编的要点(转)
- div被object覆盖的解决办法
- div被object覆盖的解决办法
- Semaphore Objects
- [Objective-C] selector 简介
- 使用Objective-C的文档生成工具:appledoc
- Object类
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十五章 数字 字符串和集合
- objective c 方法快速查询手册
- Mutex Objects
- Objective-C(十五、内存管理,MRC,循环引用,dealloc和setter方法)——iOS开发基础
- OC基础8:分类和协议