在網(wǎng)絡編程中多線程是一個必用一種技術,但是在初步時候多線程的時候一些開發(fā)者會遇到這樣或那樣的問題,其實這些問題我個人感覺主要是集中數(shù)據(jù)和線程同步上。ACE的“鎖”機制完全可以解決這些問題。
首先我們講講什么是“鎖”,在現(xiàn)實中我們需要把一些東西保護起來不讓別人使用,我們怎么辦呢?這個時候我們會用一個箱子把這些東西鎖起來,防止別人使用。線程的“鎖”就是把一部分代碼保護起來,不要別人訪問它,除非我們把箱子打開。
ace的鎖主要分三類,“讀寫鎖”“線程鎖”“進程鎖”。
“讀寫鎖”
ACE_RW_Mutex:在我們對數(shù)據(jù)進行“讀”和“寫”的時候保護數(shù)據(jù)不被其他人讀寫,說到這里我必須提一下c++中所有的類型如:vector、list、map等都不是安全的,我們在進行多線程編程是要用讀寫鎖來控制這些類型的讀寫。
首先我們來看看下面這個例子
static ACE_RW_Mutex g_RW_Mutex;

int g_Cout = 0;

DWORD WINAPI Fun1Write1(LPVOID lpParameter)//thread data


{
//g_RW_Mutex.acquire_write();
while(g_Cout < 5)

{
ACE_OS::sleep(1);//為了突出效果所以我這里暫停一秒
g_Cout++;
}
//g_RW_Mutex.release();
std::cout << "插入完成" <<std::endl;
return 0;
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])


{
HANDLE hThread1;
HANDLE hThread2;
//創(chuàng)建線程

hThread1=CreateThread(NULL,0,Fun1Write1,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun1Write2,NULL,0,NULL);
getchar();
std::cout << g_Cout << std::endl;
CloseHandle(hThread1);
CloseHandle(hThread2);
getchar();
return 0;
}


最后g_Count的結果是6.這就是數(shù)據(jù)同步的問題。
如果我們把注釋的地方打開g_Count的結果就是5
為什么g_Count的結果為6就由讀者自己來分析吧。
我來解釋一下為把注釋的地方打開后g_Count的結果會是5:g_RW_Mutex我們可以理解為一個鎖
當線程執(zhí)行到g_RW_Mutex.acquire_write()首先判斷這個鎖是不是被其他線程獲取了,如果沒有被其他線程使用,那么其他的線程執(zhí)行到這里的時候就不能繼續(xù)執(zhí)行,除非調用了g_RW_Mutex.release()釋放這個鎖,那么其他的線程才能繼續(xù)執(zhí)行,在其他線程繼續(xù)執(zhí)行的時候同樣要遵守