要实现线程的暂停或挂起功能,可以利用C++11中提供的条件变量condition_variable。下面是具体的步骤:
- 首先定义一个互斥锁mutex和条件变量condition_variable,用来实现多个线程之间的互斥和同步操作:
std::mutex mtx;
std::condition_variable cv;
- 然后在线程函数中加入while循环,用来检测是否需要挂起线程,如果需要,则调用wait函数挂起线程等待其他线程唤醒:
```
void thread_func()
{
while (true) {
// Do something...
std::unique_lock<std::mutex> lck(mtx);
while (paused) { // 自定义变量paused表示是否暂停线程
cv.wait(lck);
}
lck.unlock();
}
}
```
- 如果需要挂起线程,则可以调用notify_one函数唤醒其他线程:
paused = true; // 暂停线程
cv.notify_one(); // 唤醒其他线程
- 最后,在主线程中可以通过修改paused变量的值来控制线程的暂停和唤醒:
int main()
{
std::thread t(thread_func);
paused = true; // 暂停线程
// ...
paused = false; // 唤醒线程
cv.notify_one(); // 唤醒线程
}
下面是两个示例说明:
- 实现一个线程池,当线程池未满时可以往里添加任务,当线程池满了之后,挂起添加任务的线程,直到有线程从线程池中取出任务后唤醒它。
```
// 创建10个线程的线程池
std::vector
for (int i = 0; i < 10; i++) {
pool.emplace_back({
while (true) {
std::unique_lock
while (tasks.empty()) {
cv.wait(lck);
}
auto task = tasks.front();
tasks.pop();
lck.unlock();
task();
}
});
}
// 往线程池中添加任务
void add_task(const std::function
std::unique_lock
while (tasks.size() >= pool.size() * 2) {
cv.wait(lck);
}
tasks.push(task);
cv.notify_one();
}
```
- 实现一个下载器,当下载速度过快时,暂停下载,直到速度恢复到正常速度后继续下载。
void downloader(const std::string& url) {
// 下载文件...
while (true) {
// ...
std::unique_lock<std::mutex> lck(mtx);
if (download_speed > MAX_SPEED) {
paused = true;
cv.wait(lck);
paused = false;
cv.notify_one();
}
lck.unlock();
// 继续下载文件...
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11中std::thread线程实现暂停(挂起)功能 - Python技术站