我现在遇到一个多线程的问题:一个共享变量a, 由多个线程(X,Y1,Y2.....)共享,
X 线程负责给a 赋值,Y1,Y2.....需要读取a 的值,
读写线程之间要互斥访问a, 各个读线程之间不需要
互斥,应该怎么实现?本来想用互斥锁或信号量来做,但发现都不太合适。
我是设了两个变量来做的:u, v, 具体实现如下,大家
帮我看一下,这样是否可以,如果不行,应该怎么做?
有人说用变量来做不行,因为变量赋值也不是原子操作。int u=v=0;thread X
{
   while (u > 0)
   {
       Sleep(100); // 100ms
   }
   v = 1;
   a = 100; // set a value to a
   v = 0;
   ....... //other work
}thread Yi // i = 1,2,3....
{
   while (v != 0)
   {
       Sleep(100); // 100ms
   }
   u++;
   b = a; // use the value of a
   u--;
   ....... //other work
}

解决方案 »

  1.   

    如果用WIN32的原语,可能只能用互斥锁或信号量来实现。ACE中提供了一个单写多读的锁机制,可以参考一下。
      

  2.   

    标准的 "读者-写者" 问题, 一般的 操作系统的书中 进程同步的部分 都有介绍,书中一般方法是:
     定义 两个 信号量 sw ; sr 
     定义一个 变量 表示 正在读的,读者数 readerCnt = 0 ;reader ()
    {
      p(sr) ;
      if (0 == readerCnt)  p (sw) ;
      readerCnt ++ ;
      v (sr) ;
      // 读数据
      p (sr)
      readerCnt -- ;
      if (0 == readerCnt)  v (sw) ;
      v (sr) ;
    }
    writer ()
    {
      p (sw) ;
    // 
      v (sw) ;
    }
    如果你使用 MFC 
    你可以 用 CSemaphore 实现信号量 , p,v 操作 对应的就是 Lock Unlock .
    可以参考 msdn 
      

  3.   

    读写互斥,这里有个现成的类:http://www.codeproject.com/threads/mutexrw.asp