以下是比較原子動作嗎?也就是說,它可以減少到單個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++語言本身).. – falstro 2011-04-24 19:55:03
它不遵循,如果東西可以減少到一個單一的CPU指令,那麼它是原子。首先並非所有架構上的所有CPU指令都是原子的,其次,僅僅是因爲某些東西可以簡化爲一個原子的指令並不意味着它會是原子的。 – 2011-04-24 20:00:37