none
多线程共享内存的问题 RRS feed

  • 问题

  • ThreadA 和 ThreadB 之间的共享变量 g_MemArray ,是不是只要涉及到这个

    共享内存的操作都需要LOCK??

    比如两个线程都读,会怎样需要Lock么

     

    2010年6月29日 3:12

全部回复

  • 为了防止共享内存区被破坏,故当有写操作时需要使用Lock或使用其它方式.

    当然, 如果只读, 加不加无所谓.  个人建立还是使用Lock, 养成良好的编程习惯


    高手,是用孤独和寂寞堆砌而成的.这过程,没有任何精彩和快乐可言.自己的选择,自己承载....
    2010年6月29日 3:16
  • 但是 在高性能的编程中,如果读的话,那么就浪费时间了,是么?

    再看下面的程序

    ====== Thread A ====

    CS1.Lock()

    // operation on "g_MemArray"

    // operation on "g_abc" (在这code前后要加CS2么???)

    CS1.Unlock()

     

    ====== Thread B ====

    CS2.Lock()

    // operation on "g_abc"

    CS2.Unlock()

     我以上写法对么??其中g_abs是另外个共享变量

    • 已编辑 beyard 2010年6月29日 19:52
    2010年6月29日 4:00
  • 我觉得稳定性更重要. 再说使用也牺牲不了多少性能,可以忽略不计.

    不知道你的类的具体实现是什么(Lock, Unlock), 不好判断你的用法正确与否.

     

    ====== Thread B ====

    CS2.Lock()

    // operation on "g_abc"

    CS2.Lock()   // -- 这儿应该是UnLock吧


    高手,是用孤独和寂寞堆砌而成的.这过程,没有任何精彩和快乐可言.自己的选择,自己承载....
    2010年6月29日 9:52
  • CS1,2是临界区CriticalSection

    一般有这样的写法么:就是CriticalSection嵌套使用

    CS1.Lock()

      。。。

         CS2.Lock()

            ....

         CS2.Unlock()

    。。。

    CS1.Lock()

    2010年6月29日 19:54
  • 有,实现生产者和消费者就可能用到两个lock。但是lock最好使用RAII的方式。也就是将Lock和Unlock封装成对象,分别写在这个锁对象的构造和西沟中。这样防止异常出现上下文错误。
    麻烦把正确答案设为解答。
    2010年6月30日 3:58
    版主
  • 谢谢,能否简单说明一下,说明是生产消费
    2010年6月30日 4:46
  • 谢谢,能否简单说明一下,说明是生产消费

    我以前也不知道这个. 不过这些网上都有很多资料. 有时候自己应该先去偿试下
    高手,是用孤独和寂寞堆砌而成的.这过程,没有任何精彩和快乐可言.自己的选择,自己承载....
    2010年7月1日 15:02