gpt4 book ai didi

multithreading - 如何使用 boost::thread mutex 来同步写访问?

转载 作者:行者123 更新时间:2023-12-04 23:31:56 26 4
gpt4 key购买 nike

我有一个关于 Boost::Thread 的新手问题和 Mutex .

我想启动以下 Worker 的许多并行实例,并且所有这些都写入相同的 std::vector :

struct Worker {
std::vector<double>* vec;
Worker(std::vector<double>* v) : vec(v) {}
void operator() {
// do some long computation and then add results to *vec, e.g.
for(std::size_t i = 0; i < vec->size(); ++i) {
(*vec)[i] += some_value;
}
}
};

我知道 Worker 必须锁定 vec在写入之前并在完成后解锁(因为所有工作人员都写入相同的向量)。但是我该如何表达呢?

最佳答案

您需要一个 boost::mutex 来保护向量,并且您可以使用 boost::mutex::scoped_lock 将互斥锁锁定在其构造函数中,并在析构函数中解锁它

请记住,您需要使用相同的互斥锁 无处不在 您访问该实例的位置 vec ,无论是读取还是写入。

为了让您继续前进,您可以执行以下操作:

struct Worker {
boost::mutex &vec_mutex;

Worker(std::vector<double>* v,boost::mutex &v_mutex) : vec(v),vec_mutex(v_mutex) {}
void operator() {
// do some long computation and then add results to *vec, e.g.

boost::mutex::scoped_lock lock(vec_mutex);
for(std::size_t i = 0; i < vec->size(); ++i) {
(*vec)[i] += some_value;
}
}

};

对于更高级的东西,你应该进一步封装vector和mutex,否则你迟早会忘记这些需要连接,你会访问 vec某处没有持有锁导致很难调试的问题。对于像这个例子这样的问题,我宁愿让工作人员使用他们自己的独立向量,并在工作人员完成后将结果合并到控制线程中。

关于multithreading - 如何使用 boost::thread mutex 来同步写访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3739558/

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