gpt4 book ai didi

c++ - 如何使用 boost atomic 来消除竞争条件?

转载 作者:太空狗 更新时间:2023-10-29 21:26:35 25 4
gpt4 key购买 nike

我正在尝试使用 boost::atomic 在 Linux 上进行多线程同步。

但是,结果并不一致。

任何帮助将不胜感激。

谢谢

#include <boost/bind.hpp>
#include <boost/threadpool.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread.hpp>
#include <boost/atomic.hpp>

boost::atomic<int> g(0) ;

void f()
{

g.fetch_add(1, boost::memory_order_relaxed);

return ;
}
const int threadnum = 10;
int main()
{
boost::threadpool::fifo_pool tp(threadnum);
for (int i = 0 ; i < threadnum ; ++i)
tp.schedule(boost::bind(f));
tp.wait();
std::cout << g << std::endl ;
return 0 ;
}

最佳答案

我并不特别熟悉 boost 线程库,或者 boost::threadpool,但在我看来,当您访问 g 的值时,线程不一定已完成,因此您会得到介于 0 和10.

这是您的程序,已修改为使用标准库,并插入了连接,以便获取添加发生在 g 的输出之前。

std::atomic<int> g(0);

void f() {
g.fetch_add(1, std::memory_order_relaxed);
}

int main() {
const int threadnum = 10;
std::vector<std::thread> v;

for (int i = 0 ; i < threadnum ; ++i)
v.push_back(std::thread(f));

for (auto &th : v)
th.join();

std::cout << g << '\n';
}

编辑:

如果您的程序即使添加了 tp.wait() 仍然不一致,那就令人费解了。添加应该在线程结束之前发生,我认为线程结束将与 tp.wait() 同步,这发生在读取之前。所以所有的添加都应该在打印 g 之前发生,即使你使用 memory_order_relaxed,所以打印的值应该是 10。

关于c++ - 如何使用 boost atomic 来消除竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10966528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com