比较是原子操作吗?

Tru*_*eon 3 c++ multithreading mutex atomic operation

以下比较是原子动作吗?即,它可以简化为单个CPU指令吗?

char flag = 2;

for(;;)
{
    if (!flag) // <-- this
        break;

    // sleep
}
Run Code Online (Sandbox Code Playgroud)

这是我正在做的事情:

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();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 7

这是错误的方法.

你的主线程尽可能快地烧掉CPU周期,除了等待flag达到零之外什么都不做.除了最后一次测试外,每次尝试都会失败.而不是以这种方式执行它,使用您的线程对象最有可能必须使"主要线程暂停"的"连接"工具,直到所有工作人员完成.

这样,并非巧合的是,你不会关心测试是否是原子的,因为你根本不需要它.