gpt4 book ai didi

c++ - 在cpp中从父线程暂停和恢复线程

转载 作者:行者123 更新时间:2023-11-30 01:42:26 25 4
gpt4 key购买 nike

我正在使用 cpp 线程库。我有一个父线程 T1,它有一个子线程 T2。 T2只会循环一些item,做一些处理。我需要使用来自 T1 的函数调用从 T1 暂停和恢复 T2。 T1 和 T2 属于同一类。当特定事件到达 T1 时,我需要它来停止处理数据;请不要建议任何其他线程实现库。

    C::t2_func{
for(int i=0;i<data.size();i++)
process_data(data[i]);
}
C::spawn(){
t2 = std::make_unique<std::thread>(std::bind(&C::t2_func, this));
}
C::pause(){
//pause t2
}
C::resume(){
//resume t2
}

最佳答案

虽然不可能完全在线程外部暂停 STL 线程(一些具有更广泛的线程管理功能的特定于平台的线程可能支持它),但可以通过以下方式暂停线程线程。请注意,这意味着暂停不会在线程执行期间的任意点发生,而只会在线程函数支持暂停的特定点发生。

暂停线程的核心很简单:一个标志,表示是运行还是暂停。访问共享线程数据,比如标志,必须是同步的;这是一个次要的方面,它必然会使实现更加复杂,尽管不是特别复杂。

同步是通过在 lock_guard 上的锁(例如 unique_lockmutex )实现的;互斥锁确保代码的关键部分是互斥的(即不会被彼此打断),锁负责管理锁定和解锁互斥锁。

另外,一个 condition variable用于表示线程应该运行:暂停线程 waits直到标志表示“运行”,恢复函数 notifies标志是“运行”。由于条件变量访问共享数据,它还使用了互斥体上的锁。 std::condition_variable 支持两种等待方式:一种只是等待通知但可能会受到虚假唤醒的影响,另一种采用可调用谓词并将等待通知和谓词返回 true(允许忽略虚假唤醒)。一般来说,后者是您想要的。

假设线程函数有空返回值,一个示例实现可以是:

// shared data, threading primitives
bool pause = false;
std::condition_variable cv;
std::mutex m;

// T2's main thread function
void C::t2_func() {
for(int i = 0; i < data.size(); i++){
// wait until unpause is signaled
nap();

// do some work
process_data(data[i]);
}
}

void C::spawn() {
t2 = std::make_unique<std::thread>(std::bind(&C::t2_func, this));
}

// thread management
void C::nap() {
// must use a `unique_lock` with a `condition_variable`, not a `lock_guard`
std::unique_lock<decltype(m)> lk(m);
cv.wait(lk, []{ return ! pause; });
}

void C::pause() {
//pause
std::lock_guard<decltype(m)> lk(m);
pause = true;
}

void C::resume() {
std::lock_guard<decltype(m)> lk(m);
pause = false;
cv.notify_one();
//resume t2
}

关于c++ - 在cpp中从父线程暂停和恢复线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39631487/

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