生成线程并在它处于 运行 时执行其他操作,只要它处于活动状态
Spawn thread and do something else while it's running for as long as it's active
我在下面有一个简单的程序,其中一些长 运行 进程 someFn
工作,设置状态,工作设置状态,工作并设置状态。
虽然 someFn
是 运行,但我希望主线程查询它在 someFn
的生命周期内设置的状态。
显然这段代码是不正确的,因为 T
是 joinable
直到它真正加入并且这个程序不会停止。
如何正确地让主线程在 T
的生命周期内循环并在 T
终止后立即停止循环?
#include <iostream>
#include <thread>
#include <chrono>
int STATE = 0;
static std::mutex mtx;
void setState(int newState) {
std::lock_guard<std::mutex> lg(mtx);
STATE = newState;
}
int getState() {
std::lock_guard<std::mutex> lg(mtx);
return STATE;
}
void someFn() {
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(0);
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(1);
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(2);
}
int main()
{
std::thread T(someFn);
while (T.joinable()) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << getState() << std::endl;
}
T.join();
return 0;
}
谢谢!
只有 std::thread
你不能。
但您可以轻松制作自己的信号。例如:
#include <atomic>
#include <chrono>
#include <iostream>
#include <mutex>
#include <thread>
int STATE = 0;
static std::mutex mtx;
void setState(int newState) {
std::lock_guard<std::mutex> lg(mtx);
STATE = newState;
}
int getState() {
std::lock_guard<std::mutex> lg(mtx);
return STATE;
}
void someFn(std::atomic<bool>& isDone) {
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(0);
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(1);
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(2);
isDone.store(true);
}
int main() {
std::atomic<bool> isDone{false};
std::thread T(someFn, std::ref(isDone));
while(!isDone.load()) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << getState() << std::endl;
}
T.join();
return 0;
}
您不需要 std::atomic
的互斥锁或其他同步,因为它已经是线程安全的。
我在下面有一个简单的程序,其中一些长 运行 进程 someFn
工作,设置状态,工作设置状态,工作并设置状态。
虽然 someFn
是 运行,但我希望主线程查询它在 someFn
的生命周期内设置的状态。
显然这段代码是不正确的,因为 T
是 joinable
直到它真正加入并且这个程序不会停止。
如何正确地让主线程在 T
的生命周期内循环并在 T
终止后立即停止循环?
#include <iostream>
#include <thread>
#include <chrono>
int STATE = 0;
static std::mutex mtx;
void setState(int newState) {
std::lock_guard<std::mutex> lg(mtx);
STATE = newState;
}
int getState() {
std::lock_guard<std::mutex> lg(mtx);
return STATE;
}
void someFn() {
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(0);
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(1);
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(2);
}
int main()
{
std::thread T(someFn);
while (T.joinable()) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << getState() << std::endl;
}
T.join();
return 0;
}
谢谢!
只有 std::thread
你不能。
但您可以轻松制作自己的信号。例如:
#include <atomic>
#include <chrono>
#include <iostream>
#include <mutex>
#include <thread>
int STATE = 0;
static std::mutex mtx;
void setState(int newState) {
std::lock_guard<std::mutex> lg(mtx);
STATE = newState;
}
int getState() {
std::lock_guard<std::mutex> lg(mtx);
return STATE;
}
void someFn(std::atomic<bool>& isDone) {
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(0);
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(1);
std::this_thread::sleep_for(std::chrono::seconds(1));
setState(2);
isDone.store(true);
}
int main() {
std::atomic<bool> isDone{false};
std::thread T(someFn, std::ref(isDone));
while(!isDone.load()) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << getState() << std::endl;
}
T.join();
return 0;
}
您不需要 std::atomic
的互斥锁或其他同步,因为它已经是线程安全的。