假设我有一个线程不断更新某个对象。在更新期间,必须锁定对象以确保线程安全。
现在第二个线程更像是一种事件类型的操作。如果产生了这样的线程,我希望正在运行的更新完成它的调用,然后立即执行事件操作。
我绝对要避免的是事件线程需要等待,直到它幸运地在特定时间获得计算时间,更新线程不会锁定它需要访问的数据。
有什么方法可以使用 c++ 中的线程/互斥工具来完成此任务?还是应该将待完成的操作保存在未锁定的 var 中并在更新线程上执行操作?
//// System.h
#pragma once
#include <mutex>
#include <iostream>
#include <chrono>
#include <thread>
class System {
private:
int state = 0;
std::mutex mutex;
public:
void update();
void reset(int e);
};
//////// System.cpp
#include "System.h"
void System::update() {
std::lock_guard<std::mutex> guard(mutex);
state++;
std::cout << state << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
void System::reset(int e) {
std::lock_guard<std::mutex> guard(mutex);
state = e;
std::cout << state << std::endl;
}
////// ThreadTest.h
#pragma once
#include <iostream>
#include "System.h"
void loop_update(System& system);
void reset_system(System& system);
int main();
////// ThreadTest.cpp
#include "ThreadTest.h"
void loop_update(System& system) {
while (true) system.update();
};
void reset_system(System& system) {
system.reset(0);
};
int main()
{
System system;
std::thread t1 = std::thread(loop_update, std::ref(system));
int reset = 0;
while (true) {
std::this_thread::sleep_for(std::chrono::seconds(10));
std::cout << "Reset" << std::endl;
reset_system(system);
}
}
示例给出以下输出。您可以清楚地看到实际更新的巨大延迟。
1
...
10
Reset
11
...
16
0
1
...
10
Reset
11
...
43
0
1