【发布时间】:2017-04-10 10:10:07
【问题描述】:
我的问题是基于下面的 C++ 代码示例
#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 的示例用法。
我有 2 个 C++ std::threads 以 main 方法启动。它是osx 上的控制台应用程序。所以使用clang编译它。两个线程都使用一个共同的对象
ClassUtility 调用方法做一些繁重的任务。对于此示例代码来解释这种情况,两个线程都运行一个无限循环并仅在以下情况下关闭
应用程序关闭,即当我在控制台上按 ctrl+c 时。
寻求了解:
如果我在std::mutex 上使用std::lock_guard 来同步或保护对ClassUtility 的common_obejct 的调用是否正确。不知怎的,我似乎
遇到这种“只是一种互斥方法”的麻烦。如果我使用互斥锁锁定循环,则不会启动任何线程。此外,我有时会遇到段错误。这是因为它们是 lambdas 吗?
分配给每个线程?
在 2 个线程或 lambdas 之间使用std::condition_variable 来发出信号并同步它们会更好吗?如果是,那么如何使用std::condition_variable
在 lambda 之间?
注意:由于问题只是为了寻找信息,因此此处提供的代码可能无法编译。只是提供一个真实的场景
【问题讨论】:
-
这应该可以正常工作。你怎么知道“没有线程启动”?你能通过独立于共享状态的东西来测试它吗(例如每个线程写入自己的文件而不是共享
std::cout)? -
另外,请注意,您在这里留给并行(甚至线程切换)的空间非常小,因为互斥锁在睡眠期间保持锁定状态。
-
如果你的代码会出现死锁、饥饿或段错误,那你到底为什么要发布没有的简化代码?
-
@Angew 我放了
couts,证明我的线程方法被阻塞了 -
正如我所提到的,
std::cout是一个共享资源。您能否仅使用 per-thread 验证线程的启动方式?
标签: c++ multithreading c++11 lambda