没有测试环境,故来请教一下,大家说说这样做有同步效果吗?
就是一个CRITICAL_SECTION 在不同线程中多次保护几个不同的变量,比如在线程A中正在执行g_a=10;
线程b的g_b=21能不能执行?
另外推荐点对同步讲得比较深的参考资料吧,很多书在讲同步时都是浅浅地讲一下。线程A
{
    EnterCriticalSection(&g_cs);
    g_a = 10;
    LeaveCriticalSection(&g_cs);
    
    EnterCriticalSection(&g_cs);
    g_b = 11
    LeaveCriticalSection(&g_cs);
}线程B
{
    EnterCriticalSection(&g_cs);
    g_b = 21;
    LeaveCriticalSection(&g_cs);
    
    EnterCriticalSection(&g_cs);
    g_a = 20;
    LeaveCriticalSection(&g_cs);
}

解决方案 »

  1.   

    没有测试环境,故来请教一下,大家说说这样做有同步效果吗?
    -->有效果。但是意义何在?比如在线程A中正在执行g_a=10;
    线程b的g_b=21能不能执行?
    --->不能
      

  2.   

    在线程A中正在执行g_a=10;
    线程b的g_b=21能不能执行?
    ---------------------------
    不能执行。可以看Win32多线程程序设计,讲得还是比较清楚的
      

  3.   

    在线程A中正在执行g_a=10;
    线程b的g_b=21能不能执行?
    -----------
    不能执行??
    我觉得可以执行吧g_a和g_b是两个不同的资源阿,为什么不行?
    如果有两个共享的变量,应该设置两个临界区难道我理解错了?关注一下
      

  4.   

    不能,因为你是用一个互斥变量g_cs,当你执行EnterCriticalSection的时候,如果没有执行LeaveCriticalSection,该变量保护的临界区就不能被别的地方访问。这里你可以使用不同的互斥变量。
      

  5.   

    临界区的意思就是这样 看OS教程多个的话用PV量
      

  6.   

    哦,我理解错楼主的意思了
    按照楼主的写法,g_a=10; 和 g_b=21 是不能同时执行的但是是可以做到同时执行的
    对g_a和g_b设置两个不同的临界区这样写就可以了:
    线程A
    {
        EnterCriticalSection(&g_cs1);
        g_a = 10;
        LeaveCriticalSection(&g_cs1);
        
        EnterCriticalSection(&g_cs2);
        g_b = 11
        LeaveCriticalSection(&g_cs2);
    }线程B
    {
        EnterCriticalSection(&g_cs1);
        g_b = 21;
        LeaveCriticalSection(&g_cs1);
        
        EnterCriticalSection(&g_cs2);
        g_a = 20;
        LeaveCriticalSection(&g_cs2);
    }
      

  7.   

    不好意思,上面写反了,应该是这样:线程A
    {
        EnterCriticalSection(&g_cs1);
        g_a = 10;
        LeaveCriticalSection(&g_cs1);
        
        EnterCriticalSection(&g_cs2);
        g_b = 11
        LeaveCriticalSection(&g_cs2);
    }线程B
    {
        EnterCriticalSection(&g_cs2);
        g_b = 21;
        LeaveCriticalSection(&g_cs2);
        
        EnterCriticalSection(&g_cs1);
        g_a = 20;
        LeaveCriticalSection(&g_cs1);
    }
      

  8.   

    临界区和互斥量是一样的.只不过临界区不能跨进程共享访问,并且所创建成的线程结束时,自动会释放信号.你的那代码好像多此一举,为何这样写不更简单明了吗?
    线程A
    {
        EnterCriticalSection(&g_cs);
        g_a = 10;
        g_b = 11
        LeaveCriticalSection(&g_cs);
    }线程B
    {
        EnterCriticalSection(&g_cs);
        g_b = 21;
        g_a = 20;
        LeaveCriticalSection(&g_cs);
    }这样就可以有效保护g_a,g_b不能同时被改写了.