比较是原子操作吗?
|
以下比较是原子动作吗?即可以将其简化为一条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();
}
没有找到相关结果
已邀请:
8 个回复
秃拳割
达到零外,什么也没做。每次尝试都会失败,最后一次除外。与其以这种方式进行操作,不如使用\“ join \”工具,您的线程对象很可能必须使主线程挂起自身,直到所有工作程序完成。 这样,并非偶然,您将不会在乎测试是否是原子性的,因为您根本不需要它。
慰泥悍瓶
磨标烫徽啪
杰黔轿缺
孤捷侩
念炯
奥李
内在指令(用于x86中的
指令)可能会满足您的需要,尽管它将涉及替换数据。
厦惫
因为在1 ns内,主线程会循环并重试。 您确实要注意-不是原子的,并且同时更改它的两个线程将跳过减量:
您输了一个减量。您想使用__sync_fetch_and_sub(&flag,1),它将自动减少标记。 最后,在睡眠中旋转并不是最好的方法。您要等待某种条件,或者等待信号。当工作线程意识到将标志减为0时,使工作线程提高条件或信号。