互斥对象、事件对象、关键代码段 (一)

2014-11-24 02:51:52 · 作者: · 浏览: 13

最近复习了一下多线程的知识


作用差不多,侧重点不一样

临界区: 共享资源
互斥对象 线程间的同步
事件对象:一般用在比较复杂的地方,能够传递一些信息


下面是互斥对象、事件对象和关键代码段的比较:

1互斥对象


[cpp]
#include
#include <windows.h>
using namespace std;

// 声明两个线程函数
DWORD WINAPI ThreadProc1(
LPVOID lpParameter // thread data
);

DWORD WINAPI ThreadProc2(
LPVOID lpParameter // thread data
);

// 全局票数
int gTicket = 100;

// 互斥对象
HANDLE hMutex;

int main()
{
// 创建两个线程句柄
HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
HANDLE hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);

// 创建互斥对象
hMutex = CreateMutex(NULL, false, NULL);

// 关闭两个线程句柄
CloseHandle(hThread1);
CloseHandle(hThread2);

// 主线程睡4秒,方便两个线程函数能够获取CPU时间片
Sleep(4000);

system("pause");
return 0;
}

// 定义两个线程函数
DWORD WINAPI ThreadProc1(LPVOID lpParameter )
{
while(true)
{
WaitForSingleObject(hMutex, INFINITE);
if(gTicket > 0)
{
cout<<"thread1 sell ticket "< }
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}

DWORD WINAPI ThreadProc2(LPVOID lpParameter )
{
while(true)
{
WaitForSingleObject(hMutex, INFINITE);
if(gTicket > 0)
{
cout<<"thread2 sell ticket "< }
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}

#include
#include
using namespace std;

// 声明两个线程函数
DWORD WINAPI ThreadProc1(
LPVOID lpParameter // thread data
);

DWORD WINAPI ThreadProc2(
LPVOID lpParameter // thread data
);

// 全局票数
int gTicket = 100;

// 互斥对象
HANDLE hMutex;

int main()
{
// 创建两个线程句柄
HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
HANDLE hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);

// 创建互斥对象
hMutex = CreateMutex(NULL, false, NULL);

// 关闭两个线程句柄
CloseHandle(hThread1);
CloseHandle(hThread2);

// 主线程睡4秒,方便两个线程函数能够获取CPU时间片
Sleep(4000);

system("pause");
return 0;
}

// 定义两个线程函数
DWORD WINAPI ThreadProc1(LPVOID lpParameter )
{
while(true)
{
WaitForSingleObject(hMutex, INFINITE);
if(gTicket > 0)
{
cout<<"thread1 sell ticket "< }
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}

DWORD WINAPI ThreadProc2(LPVOID lpParameter )
{
while(true)
{
WaitForSingleObject(hMutex, INFINITE);
if(gTicket > 0)
{
cout<<"thread2 sell ticket "< }
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}


2事件对象

[cpp]
#include
#include
using namespace std;

// 声明两个线程函数
DWORD WINAPI ThreadProc1(
LPVOID lpParameter // thread data
);

DWORD WINAPI ThreadProc2(
LPVOID lpParameter // thread data
);

// 全局变量
int gTicket = 100;

// 事件对象
HANDLE hEvent;

int main()
{
// 创建两个线程句柄
HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
HANDLE hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);

// 创建时间对象
hEvent = CreateEvent(NULL, false, true, NULL);

// 关闭两个线程句柄
CloseHandle(hThread1);
CloseHandle(hThread2);

// 主线程睡4秒,让别的线程函数有机会获得CPU时间片
Sleep(4000);


system("pause");
return 0;
}


// 定义两个线程函数
DWORD WINAPI ThreadProc1(LPVOID lpParameter )
{
w