多线程互斥
2016-02-25 17:33
155 查看
考虑多线程的变量访问
// threadTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
DWORD WINAPI childThreadProc( LPVOID lpParam );
DWORD WINAPI childThreadProc2( LPVOID lpParam );
DWORD WINAPI mainThreadProc( LPVOID lpParam );
#define CREATE_THREAD_SAFE() \
{ \
ghMutex = CreateMutex(NULL, FALSE, NULL); \
}
#define DESTROY_THREAD_SAFE() \
{ \
CloseHandle(ghMutex); \
}
#define THREAD_SAFE_LOCK() \
{ \
WaitForSingleObject(ghMutex, INFINITE); \
}
#define THREAD_SAFE_UNLOCK() \
{ \
ReleaseMutex(ghMutex); \
}
typedef struct MyData {
int nThreadIndex;
HANDLE hThreandHandle;
} MYDATA, *PMYDATA;
int gnCounter;
HANDLE ghMutex;
//test1
HANDLE ghThread[10] = {0};
//test2
HANDLE ghThreadChild;
HANDLE ghThreadMain;
void threadTest1();
void threadTest2();
int _tmain(int argc, _TCHAR* argv[])
{
//threadTest1();
threadTest2();
//ResumeThread(hThread);
//SuspendThread(hThread);
system("pause");
return 0;
}
void threadTest1()
{
gnCounter = 0 ;
DWORD dwThreadID[10] = {0};
MyData* pData[10];
int i=0;
ghMutex = CreateMutex(
NULL, // default security attributes
FALSE, // initially not owned
NULL); // unnamed mutex
for(i=0; i<10; i++)
{
pData[i] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(MYDATA));
pData[i]->nThreadIndex = i;
ghThread[i] = CreateThread(NULL, 0, childThreadProc, pData[i], 0, NULL);
}
WaitForMultipleObjects(10, ghThread, true, INFINITE);
for( i=0; i < 10; i++ )
CloseHandle(ghThread[i]);
}
void threadTest2()
{
gnCounter = 0 ;
CREATE_THREAD_SAFE();
ghThreadMain = CreateThread(NULL, 0, mainThreadProc, 0, CREATE_SUSPENDED,0);
ghThreadChild = CreateThread(NULL, 0, childThreadProc2, NULL, 0, NULL);
WaitForSingleObject(ghThreadChild, INFINITE);
CloseHandle(ghThreadMain);
CloseHandle(ghThreadChild);
DESTROY_THREAD_SAFE();
}
DWORD WINAPI childThreadProc( LPVOID lpParam )
{
MyData* data = (MyData*)lpParam;
THREAD_SAFE_LOCK();
for(int i=0;i<20;i++)
{
gnCounter++;
printf("Handle:%d, child thread [%d], counter=%d\n", GetCurrentThreadId(), ghThread[data->nThreadIndex], gnCounter);
}
THREAD_SAFE_UNLOCK();
return 0;
}
DWORD WINAPI childThreadProc2( LPVOID lpParam )
{
MyData* data = (MyData*)lpParam;
for(int sumCnt=0; sumCnt<20; sumCnt++)
{
THREAD_SAFE_LOCK();
for(int i=0;i<10;i++)
{
gnCounter++;
printf("[%d]loop1>>Handle:%d, child thread [%d], counter=%d\n", sumCnt, GetCurrentThreadId(), ghThreadChild, gnCounter);
}
THREAD_SAFE_UNLOCK();
ResumeThread(ghThreadMain);
SuspendThread(ghThreadChild);
THREAD_SAFE_LOCK();
for(int i=0;i<10;i++)
{
gnCounter++;
printf("[%d]loop2>>Handle:%d, child thread [%d], counter=%d\n", sumCnt, GetCurrentThreadId(), ghThreadChild, gnCounter);
}
THREAD_SAFE_UNLOCK();
}
return 0;
}
DWORD WINAPI mainThreadProc( LPVOID lpParam )
{
MyData* data = (MyData*)lpParam;
for(int sumCnt=0; sumCnt<20; sumCnt++)
{
THREAD_SAFE_LOCK();
for(int i=0;i<10;i++)
{
gnCounter++;
printf("Handle:%d, child thread [%d], counter=%d\n", GetCurrentThreadId(), ghThreadMain, gnCounter);
}
THREAD_SAFE_UNLOCK();
ResumeThread(ghThreadChild);
SuspendThread(ghThreadMain);
}
return 0 ;
}
// threadTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
DWORD WINAPI childThreadProc( LPVOID lpParam );
DWORD WINAPI childThreadProc2( LPVOID lpParam );
DWORD WINAPI mainThreadProc( LPVOID lpParam );
#define CREATE_THREAD_SAFE() \
{ \
ghMutex = CreateMutex(NULL, FALSE, NULL); \
}
#define DESTROY_THREAD_SAFE() \
{ \
CloseHandle(ghMutex); \
}
#define THREAD_SAFE_LOCK() \
{ \
WaitForSingleObject(ghMutex, INFINITE); \
}
#define THREAD_SAFE_UNLOCK() \
{ \
ReleaseMutex(ghMutex); \
}
typedef struct MyData {
int nThreadIndex;
HANDLE hThreandHandle;
} MYDATA, *PMYDATA;
int gnCounter;
HANDLE ghMutex;
//test1
HANDLE ghThread[10] = {0};
//test2
HANDLE ghThreadChild;
HANDLE ghThreadMain;
void threadTest1();
void threadTest2();
int _tmain(int argc, _TCHAR* argv[])
{
//threadTest1();
threadTest2();
//ResumeThread(hThread);
//SuspendThread(hThread);
system("pause");
return 0;
}
void threadTest1()
{
gnCounter = 0 ;
DWORD dwThreadID[10] = {0};
MyData* pData[10];
int i=0;
ghMutex = CreateMutex(
NULL, // default security attributes
FALSE, // initially not owned
NULL); // unnamed mutex
for(i=0; i<10; i++)
{
pData[i] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(MYDATA));
pData[i]->nThreadIndex = i;
ghThread[i] = CreateThread(NULL, 0, childThreadProc, pData[i], 0, NULL);
}
WaitForMultipleObjects(10, ghThread, true, INFINITE);
for( i=0; i < 10; i++ )
CloseHandle(ghThread[i]);
}
void threadTest2()
{
gnCounter = 0 ;
CREATE_THREAD_SAFE();
ghThreadMain = CreateThread(NULL, 0, mainThreadProc, 0, CREATE_SUSPENDED,0);
ghThreadChild = CreateThread(NULL, 0, childThreadProc2, NULL, 0, NULL);
WaitForSingleObject(ghThreadChild, INFINITE);
CloseHandle(ghThreadMain);
CloseHandle(ghThreadChild);
DESTROY_THREAD_SAFE();
}
DWORD WINAPI childThreadProc( LPVOID lpParam )
{
MyData* data = (MyData*)lpParam;
THREAD_SAFE_LOCK();
for(int i=0;i<20;i++)
{
gnCounter++;
printf("Handle:%d, child thread [%d], counter=%d\n", GetCurrentThreadId(), ghThread[data->nThreadIndex], gnCounter);
}
THREAD_SAFE_UNLOCK();
return 0;
}
DWORD WINAPI childThreadProc2( LPVOID lpParam )
{
MyData* data = (MyData*)lpParam;
for(int sumCnt=0; sumCnt<20; sumCnt++)
{
THREAD_SAFE_LOCK();
for(int i=0;i<10;i++)
{
gnCounter++;
printf("[%d]loop1>>Handle:%d, child thread [%d], counter=%d\n", sumCnt, GetCurrentThreadId(), ghThreadChild, gnCounter);
}
THREAD_SAFE_UNLOCK();
ResumeThread(ghThreadMain);
SuspendThread(ghThreadChild);
THREAD_SAFE_LOCK();
for(int i=0;i<10;i++)
{
gnCounter++;
printf("[%d]loop2>>Handle:%d, child thread [%d], counter=%d\n", sumCnt, GetCurrentThreadId(), ghThreadChild, gnCounter);
}
THREAD_SAFE_UNLOCK();
}
return 0;
}
DWORD WINAPI mainThreadProc( LPVOID lpParam )
{
MyData* data = (MyData*)lpParam;
for(int sumCnt=0; sumCnt<20; sumCnt++)
{
THREAD_SAFE_LOCK();
for(int i=0;i<10;i++)
{
gnCounter++;
printf("Handle:%d, child thread [%d], counter=%d\n", GetCurrentThreadId(), ghThreadMain, gnCounter);
}
THREAD_SAFE_UNLOCK();
ResumeThread(ghThreadChild);
SuspendThread(ghThreadMain);
}
return 0 ;
}
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- C#控制台下测试多线程的方法
- 21天学习android开发教程之SurfaceView与多线程的混搭
- Ruby 多线程的潜力和弱点分析
- C#中WPF使用多线程调用窗体组件的方法
- C#如何对多线程、多任务管理(demo)
- C#实现多线程的Web代理服务器实例
- c#实现多线程局域网聊天系统