【问题标题】:C++ suspend a thread and reactivate via a different threadC++ 挂起一个线程并通过另一个线程重新激活
【发布时间】:2017-06-13 16:39:46
【问题描述】:

我没有做太多的多线程,所以我不太清楚如何搜索这个问题。它可能已经回答了,我只是不知道我在寻找什么。

基本上,我希望有一种方法可以在线程执行的特定点暂停线程。然后,我希望能够在线程通过不同线程暂停后立即恢复线程。

windows上有类似的东西吗?

【问题讨论】:

  • 您是否专门要求 Windows API?当前标准已经以可移植的方式很好地支持multithreading
  • 我会考虑使用 condition_variable 来做我想做的事吗?
  • 是的,这是我想到的第一件事。
  • 因此,据我所知,我需要为每个要挂起的线程设置一个互斥锁,该互斥锁在锁定线程和解锁线程之间共享。是这样吗?这似乎很简单!

标签: c++ windows multithreading


【解决方案1】:

尝试使用 std::condition_variable。条件变量是可用于阻塞线程的“同步原语”。您可以在此处找到有关条件变量的更多信息:http://en.cppreference.com/w/cpp/thread/condition_variable

下面是一个快速 C++ 程序的示例,它演示了所讨论的行为。您可以像这样阻止和解除阻止另一个线程的线程:

#include<iostream>
#include<thread>
#include<condition_variable>
#include<mutex>
std::condition_variable cv;
std::mutex lock;
void foo(){
        std::unique_lock<std::mutex> ulock(lock);
        cv.wait(ulock);
        std::cout<<"Thread Complete"<<std::endl;
}
void bar(){
        cv.notify_all();
}
int main()
{
        std::thread first(foo);
        std::thread second(bar);
        first.join();
        second.join();
        return 0;
}

【讨论】:

  • 我会尝试在我的项目中包含这个想法,并让你知道它是如何进行的。您知道是否可以将互斥锁分配给结构的元素?尝试执行此操作时出现错误。
  • 你是什么意思“将互斥锁分配给结构的元素”你的意思是想在 STL 数据结构中包含互斥锁?
  • 我创建了一个名为 threadInfo 的结构,它由一个互斥锁和一个 int 组成。我想保留该结构的 std::list 。当我尝试做 std::mutex newMutex;线程信息信息; info.m = newMutex;我收到错误,std::mutex operator = 是一个已删除的函数
  • 该结构已经创建了默认互斥锁。您不能将互斥锁分配给其他互斥锁。事实上,你实际上并不需要。您的结构实例已经准备好使用互斥锁。您是否有理由尝试更改该互斥锁,或者您只是想确保一个互斥锁存在?
  • 哦,是的,你是对的。结构已经有一个互斥锁,这让我很头疼。出于某种原因,我看到它就像我只为互斥锁创建了一个容器,但仍然必须放入一个。谢谢!
【解决方案2】:

对不起,只是在做

#include<iostream>
#include<thread>
#include<condition_variable>
#include<mutex>
std::condition_variable cv;
std::mutex lock;
void foo() {
    std::unique_lock<std::mutex> ulock(lock);
    cv.wait(ulock);
    std::cout << "Thread Complete" << std::endl;
}
void bar() {
    cv.notify_all();
}
int main()
{
    std::thread second(bar);
    std::thread first(foo);
    
    first.join();
    second.join();
    return 0;
}

例如,例如将“第二”作为..ehr ...首先开始

这个 LOCKS 在 Visual Studio 中,例如..

(我所期望的,因为我们在有人等待通知之前通知...)

【讨论】:

猜你喜欢
  • 2013-03-08
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多