我的问题是基于以下的C++代码C++:与std :: lock_guard`互斥是否足以同步两个`std :: thread`s?
#include <chrono>
#include <thread>
#include <mutex>
#include <iostream>
class ClassUtility
{
public:
ClassUtility() {}
~ClassUtility() {}
void do_something() {
std::cout << "do something called" << std::endl;
using namespace std::chrono_literals;
std::this_thread::sleep_for(1s);
}
};
int main (int argc, const char* argv[]) {
ClassUtility g_common_object;
std::mutex g_mutex;
std::thread worker_thread_1([&](){
std::cout << "worker_thread_1 started" << std::endl;
for (;;) {
std::lock_guard<std::mutex> lock(g_mutex);
std::cout << "worker_thread_1 looping" << std::endl;
g_common_object.do_something();
}
});
std::thread worker_thread_2([&](){
std::cout << "worker_thread_2 started" << std::endl;
for (;;) {
std::lock_guard<std::mutex> lock(g_mutex);
std::cout << "worker_thread_2 looping" << std::endl;
g_common_object.do_something();
}
});
worker_thread_1.join();
worker_thread_2.join();
return 0;
}
样品这更是一个问题,让我认识不明确,而&得到std::condition_variable
样本使用IFF需要。
我有2个C++ std::thread
s在main
方法启动。它的一个控制台应用程序osx
。所以使用clang编译它。这两个线程使用通用对象 ClassUtility
来调用一个方法来完成一些繁重的任务。对于这个示例代码来解释这种情况,只有当 应用程序关闭时,即当我在控制台上按ctrl+c
时,这两个线程才会运行无限循环&关闭。
寻求认识:
它是正确的,如果我强行使用std::lock_guard
上std::mutex
同步或保护到ClassUtility
的common_obejct
的呼吁。不知何故,我似乎 陷入困境与这个“只是一个互斥方法”。如果我使用互斥锁锁定循环,则线程都不会启动。而且,我有时会遇到段错误。这是因为他们是lambda? 分配给每个线程?
使用2个线程之间的std::condition_variable
还是使用lambda表示信号&同步它们会更好?如果是的话,那么std::condition_variable
如何在这里使用 之间的lambda?
注意:由于问题只是寻求信息,因此这里提供的代码可能无法编译。它只是提供一个真实的情景
这应该工作得很好。你怎么知道“没有任何线索开始?”你可以通过独立于共享状态的东西(比如每个线程写入自己的文件而不是共享'std :: cout')来测试它吗? – Angew
另外,请注意,这里为并行性(甚至是线程切换)留下了很小的空间,因为互斥锁在睡眠期间保持锁定状态。 – Angew
如果你有代码,你会遇到死锁或饥饿或段错误,为什么地球上你发布的简化代码不? – paddy