1. 程式人生 > 其它 >VC++執行緒同步之臨界區(CriticalSection)

VC++執行緒同步之臨界區(CriticalSection)

1、相關檔案和介面

#include <windows.h>

CRITICAL_SECTION cs;//定義臨界區物件
InitializeCriticalSection(&cs);//初始化臨界區
EnterCriticalSection(&cs);//進入臨界區
LeaveCriticalSection(&cs);//離開臨界區
DeleteCriticalSection(&cs);//刪除臨界區

2、測試程式碼

#include <Windows.h>
#include <string>
#include <iostream>
CRITICAL_SECTION cs;
DWORD WINAPI Fun(LPVOID lpParamter)
{
    std::
string strPrint((const char*)lpParamter); int iRunTime = 0; while(++iRunTime<10) { EnterCriticalSection(&cs); std::cout <<"["<< iRunTime <<"]:"<< strPrint.c_str()<<std::endl; LeaveCriticalSection(&cs); Sleep(
1); //離開臨界區後執行緒進行休眠,其它執行緒進入臨界區的概率大大降低,所以需要短暫休眠。 } return 0; } int _tmain(int argc, _TCHAR* argv[]) { InitializeCriticalSection(&cs); //建立五個子執行緒 std::string str1 = "A"; std::string str2 = "B"; std::string str3 = "C"; std::string str4 = "D"; std::string str5 = "
E"; HANDLE hThread1 = CreateThread(NULL, 0, Fun, (void*)str1.c_str(), 0, NULL); HANDLE hThread2 = CreateThread(NULL, 0, Fun, (void*)str2.c_str(), 0, NULL); HANDLE hThread3 = CreateThread(NULL, 0, Fun, (void*)str3.c_str(), 0, NULL); HANDLE hThread4 = CreateThread(NULL, 0, Fun, (void*)str4.c_str(), 0, NULL); HANDLE hThread5 = CreateThread(NULL, 0, Fun, (void*)str5.c_str(), 0, NULL); //關閉執行緒 CloseHandle(hThread1); CloseHandle(hThread2); CloseHandle(hThread3); CloseHandle(hThread4); CloseHandle(hThread5); getchar(); DeleteCriticalSection(&cs); return 0; }

測試效果

3、Linux平臺

在Linux環境下,沒有Windows下的臨界區的概念,但是也可以利用互斥量實現該功能。

#include <pthread.h>
int pthread_mutexattr_init(pthread_mutexattr_t *attr); /*初始化函式*/
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);/*去初始化函式*/

int pthread_mutex_lock(pthread_mutexattr_t *attr)/*加鎖*/
int pthread_mutex_unlock(pthread_mutexattr_t *attr)/*解鎖*/

臨界區與互斥體的區別:

  • 臨界區只能用於物件在同一程序裡執行緒間的互斥訪問;互斥體可以用於物件程序間或執行緒間的互斥訪問。
  • 臨界區是非核心物件,只在使用者態進行鎖操作,速度快;互斥體是核心物件,在核心態進行鎖操作,速度慢。
  • 臨界區和互斥體在Windows平臺都下可用;Linux下只有互斥體可用。
  • 臨界區:通過對多執行緒的序列化來訪問公共資源或一段程式碼,速度快,適合控制資料訪問。
  • 互斥量:為協調共同對一個共享資源的單獨訪問而設計的。