2013-03-19 134 views
7

我有一个C++代码,其中有两个线程。在线程2中的事件'A'之后,线程1应该暂停(挂起),线程2中要执行更多的任务(比如事件'B'),最后线程1应该被恢复。有没有办法做到这一点?暂停和恢复一个C++线程在另一个

我的代码看起来是这样的:

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; 
} 
+0

你正在做的,现在,什么问题? – deepmax 2013-03-19 14:09:51

+5

随机死锁,毫无疑问。 – 2013-03-19 14:56:56

回答

0

既然你似乎是使用Win32,你可以使用一个event

如果你想要做的并行线程类似的东西有一个example here

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

8

嗨我有一个例子,我从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; 
} 

希望帮助,任何意见,欢迎:-)