【发布时间】:2016-11-15 16:01:20
【问题描述】:
DBThread::DBThread() : running_(false)
{
}
DBThread::~DBThread()
{
if (thread_)
{
thread_->join();
}
}
void DBThread::Init()
{
thread_ = std::make_shared<std::thread>(std::bind(&DBThread::Run, this));
std::unique_lock<std::mutex> lock(mutex_);
cv_.wait(lock, [&] {return running_; });
std::cout << "Init success";
}
void DBThread::AddTask(std::shared_ptr<Delegate> task)
{
std::lock_guard<std::mutex> lock(mutex_);
task_queue_.push(task);
}
void DBThread::Run()
{
running_ = true;
cv_.notify_all();
while (true)
{
std::unique_lock<std::mutex> lock(mutex_);
cv_.wait(lock, [&] {return !task_queue_.empty(); });
std::cout << "run task" << std::endl;
}
}
我有两个线程,我们将其命名为 A 和 B,A 调用 Init 并等待 B 完全初始化,即使 running_ 为真,A 有时也会等待。知道为什么会发生这种情况。任何帮助将不胜感激。
【问题讨论】:
-
running_是什么类型?bool或std::atomic<bool>? -
running_ 纯粹是 bool,我试过将它声明为 std::atomic
,还是不行 -
@user2260241 默认情况下,C++ 中的任何内容都不能保证是原子的,甚至
bool也不保证。您必须同步对running_的访问,否则您将遇到数据竞争。
标签: c++ multithreading c++11