Visual C++中的多线程

发表于:2007-06-11来源:作者:点击数: 标签:
以前,曾经研究过了 java 中的多线程问题,特别是加锁和同步问题,但是,在C++中,确没有这么简单了。由于C没有提供像java里的线程类,一些同步的实现必须靠自己程序实现,稍显复杂。 一般来说,在C++里面创建和终止线程的函数为:_beginthread和_endthread

以前,曾经研究过了java中的多线程问题,特别是加锁和同步问题,但是,在C++中,确没有这么简单了。由于C没有提供像java里的线程类,一些同步的实现必须靠自己程序实现,稍显复杂。

一般来说,在C++里面创建和终止线程的函数为:_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)



原文转自:http://www.ltesting.net

...