我现在遇到一个多线程的问题:一个共享变量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
}
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
}
定义 两个 信号量 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