【问题标题】:Suspend and resume one C++ thread in another在另一个 C++ 线程中挂起和恢复一个 C++ 线程
【发布时间】:2013-03-08 06:09:41
【问题描述】:

我有一个包含两个线程的 C++ 代码。在线程 2 中的事件“A”之后,线程 1 应该暂停(挂起),线程 2 中将执行更多任务(例如事件“B”),最后线程 1 应该恢复。有没有办法做到这一点?

我的代码如下所示:

HANDLE C;
DWORD WINAPI A (LPVOID in)
{
    while(1){
        // some operation
    }
    return 0;
}

DWORD WINAPI B (LPVOID in)
{
    while(1){

        //Event A occurs here

        SuspendThread (C);

        //Event B occurs here

        ResumeThread (C);
        }
    return 0;
}

int main()
{
    C = CreateThread (NULL, 0, A, NULL, 0, NULL);
    CreateThread (NULL, 0, B, NULL, 0, NULL);
    return 0;
}

【问题讨论】:

  • 你现在正在这样做,有什么问题?
  • 随机死锁,毫无疑问。

标签: c++ multithreading winapi


【解决方案1】:

您好,我有一个示例,我从 cpp 参考中得到启发。 该示例使用 C++ 11,因此鉴于此问题未标记为 win32,但 c++ 和多线程我发布了一些内容。

这里首先是原始链接。

http://en.cppreference.com/w/cpp/thread/sleep_for

现在这是我得到的解决问题的代码。

#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;

void ThreadB_Activity()
{
    // Wait until ThreadA() sends data
    {
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk, []{return ready;});
    }

    std::cout << "Thread B is processing data\n";
    data += " after processing";
    // Send data back to ThreadA through the condition variable
    {
        std::lock_guard<std::mutex> lk(m);
        processed = true;
        std::cout << "Thread B signals data processing completed\n";
    }
    cv.notify_one();
}


void ThreadA_Activity()
{
    std::cout<<"Thread A started "<<std::endl;
    data = "Example data";
    // send data to the worker thread
    {
        std::lock_guard<std::mutex> lk(m);
        ready = true;
        std::cout << "Thread A signals data are ready to be processed\n";
    }
    cv.notify_one();//notify to ThreadB that he can start doing his job

    // wait for the Thread B
    {
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk, []{return processed;});
    }
    std::cout << "Back in Thread A , data = " << data << '\n';

    std::this_thread::sleep_for( std::chrono::milliseconds( 1000 ));
    std::cout<<"end of Thread A"<<std::endl;
}


int main()
{
    std::thread ThreadB(ThreadB_Activity);
    std::thread ThreadA(ThreadA_Activity);

    ThreadB.join();
    ThreadA.join();

    std::cout << "Back in main , data = " << data << '\n';
    return 0;
}

希望有帮助,欢迎任何 cmets :-)

【讨论】:

    【解决方案2】:

    由于您似乎使用的是 win32,因此您可以使用event

    如果你想在 pthreads 中做类似的事情,有一个 example here

    在这两种情况下,线程 A 将测试条件/事件(如果设置则等待,否则继续),线程 B 将设置并清除条件/事件。请注意,您可能还需要线程 A 和 B 之间的互斥锁,具体取决于它们在做什么,它们会相互破坏吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      相关资源
      最近更新 更多