线程同步---临界区

线程同步

#include 
#include 
#include 
#include 
using namespace std;


/*
优点:效率高,与互斥和事件这些内核同步对象相比,临界区是用户态下的对象,即只能在同一进程中实现
线程互斥。因无需在用户态和内核态之间切换,所以工作效率比较互斥来说要高很多。

缺点:资源释放容易出问题,Critical Section不是一个核心对象,无法获知进入临界区的线程是生是死,
如果进入临界区的线程挂了,没有释放临界资源,系统无法获知,而且没有办法释放该临界资源。

临界区是一种轻量级的同步机制,与互斥和事件这些内核同步对象相比,临界区是用户态下的对象,
即只能在同一进程中实现线程互斥。因无需在用户态和核心态之间切换,所以工作效率比较互斥来说
要高很多。
*/
// 定义一个临界区变量
int counter = 0;
CRITICAL_SECTION g_cs;

void doit(void* arg)
{
    int i, val = 0;
    EnterCriticalSection (&g_cs);
    //等待指定临界区部分对象的所有权。 此函数将在授予调用线程所有权时返回。
    for (i=0; i<5; i++)
    {
        val = counter;
        printf("thread %d : %d\n", (int*)arg, val+1);
        counter = val + 1;
    }
    LeaveCriticalSection(&g_cs);//释放指定临界区对象的所有权。
}


int main(int argc, char*argv[])
{
    // 初始化临界区
    InitializeCriticalSection(&g_cs);//初始化临界区对象。

    HANDLE hThread1 = CreateThread(nullptr,0, (LPTHREAD_START_ROUTINE)doit, (void*)1, 0, nullptr);
    HANDLE hTrehad2 = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)doit, (void*)2, 0, nullptr);

    WaitForSingleObject(hThread1, 10*1000);
    WaitForSingleObject(hTrehad2, 3*1000);
    // 删除临界区
    DeleteCriticalSection(&g_cs);

    return 0;
}

你可能感兴趣的:(c++)