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)
这是错误的方法.
你的主线程尽可能快地烧掉CPU周期,除了等待flag达到零之外什么都不做.除了最后一次测试外,每次尝试都会失败.而不是以这种方式执行它,使用您的线程对象最有可能必须使"主要线程暂停"的"连接"工具,直到所有工作人员完成.
这样,并非巧合的是,你不会关心测试是否是原子的,因为你根本不需要它.
| 归档时间: |
|
| 查看次数: |
3210 次 |
| 最近记录: |