none
一个程序创建了多个线程,这些线程都需要对一个全局变量取值或者赋值,请问有什么方法可以确保不会产生冲突? RRS feed

  • 问题

  • 有人告诉我说尝试“临界区”,我查了一下MSDN,就是

    1、InitializeCriticalSection(&cs);

    2、然后在需要操作的地方用:EnterCriticalSection(&cs);

    3、用完之后LeaveCriticalSection(&cs);

    4、最后:DeleteCriticalSection(&cs);

     

    但是我测试过好像不行,我不知道我漏了什么,还是说我根本就用错了方法?求高人指点迷津。


    da jia hao!
    2010年10月2日 15:41

答案

  • 如果只是个一般的全局变量的话,用volatile这个关键字就可以原子化操作了。

    若是代码段的话用InitializeCriticalSection和LeaveCriticalSection将代码段加锁保持原子化


    0xBAADF00D
    • 已标记为答案 liubin 2010年10月5日 14:22
    2010年10月5日 1:53
    版主

全部回复

  • 如果只是个一般的全局变量的话,用volatile这个关键字就可以原子化操作了。

    若是代码段的话用InitializeCriticalSection和LeaveCriticalSection将代码段加锁保持原子化


    0xBAADF00D
    • 已标记为答案 liubin 2010年10月5日 14:22
    2010年10月5日 1:53
    版主
  • 您好,

    这里有篇相关的文章,您可以参考一下:

    http://beyondjhf-2008.javaeye.com/blog/679141

    希望对您有所帮助。


    Daoping Liu - MSFT
    2010年10月5日 2:07
    版主
  • 1、InitializeCriticalSection(&cs); <- 进程初始化时候调用

    2、然后在需要操作的地方用:EnterCriticalSection(&cs);  <- 每次要变数据前都要调用

    3、用完之后LeaveCriticalSection(&cs); <- 每次要变数据后都要调用

    4、最后:DeleteCriticalSection(&cs); <- 进程结束前调用


    best regards, lu0 For more information, check out http://lu0s1.3322.org
    2010年10月11日 9:55