【发布时间】:2011-04-24 19:48:21
【问题描述】:
下面的比较是原子动作吗?即,是否可以简化为一条 CPU 指令?
char flag = 2;
for(;;)
{
if (!flag) // <-- this
break;
// sleep
}
这就是我正在做的事情:
int main()
{
sf::Mutex Mutex;
char flag = 2;
coordinatorFunction(flag);
for(;;)
{
if (!flag)
break;
// sleep
}
}
void workerFunction(void* a)
{
char* p = static_cast<char*>(a);
// work
GlobalMutex.Lock();
--*p;
GlobalMutex.Unlock();
}
void coordinatorFunction(char& refFlag)
{
sf::Thread worker1(&workerFunction, &refFlag);
sf::Thread worker2(&workerFunction, &refFlag);
worker1.Launch();
worker2.Launch();
}
【问题讨论】:
-
我认为在进行比较之前总是必须将其读入寄存器,因为您已经传递了指向它的指针。所以不,它不会是原子的。我是这么想的,我不确定。不过,我相信有一些方法可以进行原子比较和写入(我猜不是在 C++ 语言本身内)..
-
这并不意味着如果某些东西可以简化为一条 CPU 指令,那么它就是原子的。首先,并非所有架构上的所有 CPU 指令都是原子的,其次,仅仅因为某些东西可以简化为原子指令并不意味着它会是原子的。
标签: c++ multithreading mutex atomic operation