|
以前,曾经研究过了java中的多线程问题,特别是加锁和同步问题,但是,在C++(www.cppentry.com)中,确没有这么简单了。由于C没有提供像java里的线程类,一些同步的实现必须靠自己程序实现,稍显复杂。
一般来说,在C++(www.cppentry.com)里面创建和终止线程的函数为:_beginthread和_endthread两个函数,当然,也可以用CreateThread和ExitThread。具体的使用方式可以查看msdn。
那么,怎么样实现加锁与同步呢?可以使用createMutex函数以及createEvent方法等来实现,具体可以参考下例:
#include < iostream>
#include < windows.h>

using namespace std;
#define BUFSIZE 5
int SharedBuffer[BUFSIZE];
int head,tail;
int count;
HANDLE hMutex;
HANDLE hNotFullEvent, hNotEmptyEvent;
void BB_Producer() ...{ int i; for (i=20; i>=0; i--) ...{ while(1) ...{ WaitForSingleObject(hMutex,INFINITE); if (count == BUFSIZE) ...{ // 缓冲区满 ReleaseMutex(hMutex); // 等待直到缓冲区非满 WaitForSingleObject(hNotFullEvent,INFINITE); continue; } // 得到互斥锁且缓冲区非满,跳出while循环 break; } // 得到互斥锁且缓冲区非满,开始产生新数据 cout << "Produce: " << i << endl; SharedBuffer[tail] = i; tail = (tail+1) % BUFSIZE; count++; ReleaseMutex(hMutex); // 结束临界区 PulseEvent(hNotEmptyEvent); // 唤醒消费者线程 } }
void BB_Consumer() ...{ int result; while (1) ...{ WaitForSingleObject(hMutex,INFINITE); if (count == 0) ...{ // 没有可以处理的数据 ReleaseMutex(hMutex); // 释放互斥锁且等待 // 等待直到缓冲区非空 WaitForSingleObject(hNotEmptyEvent,INFINITE); } else if (SharedBuffer[head] == 0) ...{ cout << "Consumed 0: end of data" << endl; ReleaseMutex(hMutex); // 结束临界区 ExitThread(0); } else ...{ // 获得互斥锁且缓冲区有数据,开始处理 result = SharedBuffer[head]; cout << "Consumed: " << result << endl; head = (head+1) % BUFSIZE; count--; ReleaseMutex(hMutex); // 结束临界区 PulseEvent(hNotFullEvent); // 唤醒生产者线程 } } }
void main() ...{ HANDLE hThreadVector[2]; DWORD ThreadID; count = 0; head = 0; tail = 0; hMutex = CreateMutex(NULL,FALSE,NULL); hNotFullEvent = CreateEvent(NULL,TRUE,FALSE,NULL); hNotEmptyEvent = CreateEvent(NULL,TRUE,FALSE,NULL); hThreadVector[0] = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) BB_Producer, NULL, 0, (LPDWORD)&ThreadID); hThreadVector[1] = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) BB_Consumer, NULL, 0, (LPDWORD)&ThreadID); WaitForMultipleObjects(2,hThreadVector,TRUE,INFINITE); }
这是一个典型的生产者-消费者问题,它们公用的资源是SharedBuffer,当Buffer中有数据且未满时,两个线程都可以运行,当Buffer为空时,Consumer就要等待,直到Buffer不为空,这里就是用event来实现的;同样,当Buffer为满时,Producer就要等待。
来源链接: http://tb.blog.csdn.net/TrackBack.aspx PostId=1355892
(责任编辑 火凤凰 sunsj@51cto.com TEL:(010)68476636-8007)
|