本文简单地讲解了VC++的多线程,一般来说,在C++里面创建和终止线程的函数为:_beginthread和_endthread两个函数,当然,也可以用CreateThread和ExitThread。
ÒÔÇ°£¬Ôø¾Ñо¿¹ýÁË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¾ÍÒªµÈ´ý¡£
²é¿´±¾ÎÄÀ´Ô´