【发布时间】:2019-09-25 16:24:16
【问题描述】:
我想正确同步不同的线程,但到目前为止我只能编写一个不优雅的解决方案。有人可以指出我如何改进以下代码吗?
typedef void (*func)();
void thread(func func1, func func2, int& has_finished, int& id) {
has_finished--;
func1();
has_finished++;
while (has_finished != 0) std::cout << "thread " << id << " waiting\n";
std::cout << "thread" << id << "resuming\n";
func2();
}
int main() {
int has_finished(0), id_one(0), id_two(1);
std::thread t1(thread, fun, fun, std::ref(has_finished), std::ref(id_one));
std::thread t2(thread, fun, fun, std::ref(has_finished), std::ref(id_two));
t1.join();
t2.join();
};
程序的要点由函数thread 描述。该函数由两个std::threads 执行。该函数接受两个长时间运行的函数 func1 和 func2 以及两个整数引用作为参数。 线程应该只在所有线程退出func1 后调用func2。参数has_finished 用于协调不同的线程:进入函数后,has_arguments 为零。然后每个std::thread 递减值并调用长时间运行的函数func1。离开func1 后,has_finished 再次递增。只要该值不是其原始值零,线程就会等待。然后,每个线程都在func2 上工作。主要功能显示在最后。
如何更好地协调两个线程?我正在考虑使用std::mutex 和std::condition_variable,但不知道如何正确使用它们?有人知道我可以如何改进这个程序吗?
【问题讨论】:
-
需要什么协调对我来说并不明显。是否允许所有线程同时执行 func1 和 func2;但是您希望所有线程在任何线程启动 func2 之前完成 func1?如果是这样,请查找屏障同步。如果没有,您能否阐明所需的协调。
-
没有原始同步:您需要某种屏障或闩锁原语。例如。 Abseil 有
absl::BlockingCounter:godbolt.org/z/N4oexX,Boost 有boost::latch:wandbox.org/permlink/RLZnqUrtDOoA9o7y。 -
@mevets :感谢您的评论。事实上,我希望所有线程在开始处理
func2之前完成func1。我希望我澄清了我的问题。
标签: c++ multithreading performance mutex