线程同步---临界区

线程同步

#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <fstream>
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44585751

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值