我想删除旧代码中线程处理方式的一些Windows依赖项,如何将这段代码转换为C++11线程样式?
MyClass运行方法:
void MyClass::run()
{
while(true)
{
WaitForSingleObject(startEvent, INFINITE);
processData();
ResetEvent(startEvent);
SetEvent(hEvent);
}
}
另一类的主要更新:
{
.
.
.
WaitForSingleObject(myClassInstance.hEvent, INFINITE);
ResetEvent(myClassInstance.hEvent);
// Getting data processed by myClassInstance in the previous update call
// Mem copies to myClassInstance to be used later by myClassInstance processData()
SetEvent(myClassInstance.startEvent);
.
.
.
}
您可以使用std::condition_variable
和bool
:轻松创建事件类
class Event {
std::condition_variable cv_;
std::mutex mtx_;
bool signaled_ = false;
public:
void wait() {
std::unique_lock<std::mutex> lock{mtx_};
while (!signaled_) {
cv_.wait(lock);
}
}
void reset() {
std::lock_guard<std::mutex> lock{mtx_};
signaled_ = false;
}
void set() {
{
std::lock_guard<std::mutex> lock{mtx_};
signaled_ = true;
}
cv_.notify_one();
}
};
导致使用:
struct MyClass {
Event start;
Event ready;
void processData();
void run();
};
void MyClass::run() {
while (true) {
start.wait();
processData();
start.reset();
ready.set();
}
}
void main_update_in_another_class() {
ready.wait();
ready.reset();
// Getting data processed by myClassInstance in the previous update call
// Mem copies to myClassInstance to be used later by myClassInstance processData()
start.set();
// Do other things that don't require access to myClassInstance
}
在Coliru观看现场演示。