c++ - 产生线程并在它运行时做其他事情,只要它是事件的

标签 c++ multithreading stdthread

我在下面有一个简单的程序,其中一些长时间运行的进程 someFn 工作,设置状态,工作设置状态,工作并设置状态。

someFn 运行时,我希望主线程查询它为 someFn 的生命周期设置的状态。

显然这段代码是不正确的,因为 Tjoinable 直到它真正加入并且这个程序不会停止。

如何正确地让主线程在 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 不需要互斥锁或其他同步,因为它已经是线程安全的。

关于c++ - 产生线程并在它运行时做其他事情,只要它是事件的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58844510/

相关文章:

c++ - OpenMP、MPI、POSIX 线程、std::thread、boost::thread 如何关联?

c++ - 在 Visual Studio 中启用 DEP

C++错误:Assignment of read-only location

c++ - Unity3D中的高清视频通话

c# - 打破 parallel.foreach?

javascript - Node.js 架构和性能

c++ - posix 线程和 O3 优化

java - 是否有一个 ExecutorService 为每个任务创建一个新线程?

c++ - 在单独的线程中启动带参数的成员函数

c++ - 为什么用空函数运行 std::thread 会消耗大量内存