gpt4 book ai didi

c++ - C++11 中的线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:54:14 25 4
gpt4 key购买 nike

我正在将我的 C++ 技能更新到 C++11。我负责线程,这始终是一个问题区域。考虑这个测试代码:

// threaded.h
class MyThreadedClass
{
public:
MyThreadClass();
bool StartThread();
bool IsThreadDone();
inline void WorkThread();

private:
std::thread* workThread;
atomic<bool> threadDone;
}

// threaded.cpp
MyThreadedClass::MyThreadedClass() {
workThread = nullptr;
threadDone.store(true);
}

bool MyThreadedClass::StartThread() {
if (!threadDone.load()) { return false; }
threadDone.store(false);
workThread = new std::thread(&MyThreadedClass:WorkThread, this);
workThread->detach();
return true;
}

bool MyThreadedClass:IsThreadDone() {
return threadDone.load();
}

inline void MyThreadedClass::WorkThread() {
while (some_condition) { /*Do work*/ }
threadDone.store(true);
}

// main.cpp
int main() {
MyThreadedClass testInstance;
testInstance.StartThread();
for (int x = 0; x < 10; x++) {
do {
// This is sometimes true:
if (testInstance.StartThread()) { return 1;}
} while (!testInstance.IsThreadDone())
}
return 0;
}

我想查看此类代码的最坏情况,因此我在等待线程终止时在 main 中不断地敲打它。有时会触发 main 中的失败条件。与许多线程问题一样,它不一致,因此不容易调试。

使用 threadDone 变量是因为我在实际代码中访问一个文件并且不希望多个线程访问同一个文件。

欢迎深入了解我遗漏的内容或使用 C++11 习语重新设计它的方法。

最佳答案

使用 std::mutex 而不是 std::atomic,实现非常简单。

class MyThreadedClass
{
std::mutex _mutex;
std::unique_ptr<std::thread> _thread;
bool _done{false};
public:
MyThreadClass() = default;
bool StartThread()
{
std::lock_guard<std::mutex> lock(_mutex);
if (_thread || _done) return false;
_thread = std::make_unique<std::thread>(&MyThreadedClass, this);
return true;
}
bool IsThreadDone()
{
std::lock_guard<std::mutex> lock(_mutex);
return _done;
}
void WorkThread()
{
// do some work
std::lock_guard<std::mutex> lock(_mutex);
_done = true;
}
}

关于c++ - C++11 中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22588843/

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