【发布时间】:2019-06-06 11:26:06
【问题描述】:
在 Windows 7(64 位)下使用来自 MSYS2 的 Poco 1.9.0-1。
我有一个线程,发出 3 次 Poco:Condition 信号,睡眠时间为 300 毫秒。
我有两个线程使用两个不同的类 EvListenerA 和 EvListenerB,它们从 Poco::Runnable 扩展,它们正在等待同一个 Poco::Condition 以显示带有 std::cout 的消息。
使用第一个和第二个信号没有问题,但是当启动第三个信号时,只有线程 EvListenerA 正确捕获它。
这是代码:
/*
* main.cpp
*
* Created on: 6 jun. 2019
* Author: ccortiz
*/
#include <Poco/Thread.h>
#include <Poco/Runnable.h>
#include <Poco/Condition.h>
#include <iostream>
using namespace std;
Poco::Condition condicion;
Poco::Mutex mutex;
class GenEvents:public Poco::Runnable{
public:
void run(){
cout << "Launching GenEvents!" << endl;
for (Poco::UInt32 i=0; i<3; i++){
cout << "[GenEvents] Event_" << i << endl;
condicion.broadcast();
Poco::Thread::sleep(300); //Wait 300ms.
}
cout << "Ending GenEvents!" << endl;
}
};
class EvListenerA:public Poco::Runnable{
public:
void run(){
cout << "Launching EvListenerA!" << endl;
for (Poco::UInt32 i=0; i<3; i++){
condicion.wait(mutex);
cout << " [EvListenerA] Receiving Event_" << i << endl;
}
cout << "Ending EvListenerA!" << endl;
}
};
class EvListenerB:public Poco::Runnable{
public:
void run(){
cout << "Launching EvListenerB!" << endl;
for (Poco::UInt32 i=0; i<3; i++){
condicion.wait(mutex);
cout << " [EvListenerB] Receiving Event_" << i << endl;
}
cout << "Ending EvListenerB!" << endl;
}
};
int main(void){
Poco::Thread th1; //Hilo que genera 3 eventos.
Poco::Thread th2; //Hilo que espera 3 eventos.
Poco::Thread th3; //Hilo que espera 3 eventos.
GenEvents genEvents; //Objeto que implementa el hilo generador de eventos.
EvListenerA evListenerA; //Objeto que implementa el hilo receptor de eventos.
EvListenerB evListenerB; //Objeto que implementa el hilo receptor de eventos.
th2.start(evListenerA);
th3.start(evListenerB);
Poco::Thread::sleep(500); //Espera de medio segundo.
th1.start(genEvents);
th1.join();
th2.join();
th3.join();
}
这是程序输出:
Launching EvListenerB!
Launching EvListenerA!
Launching GenEvents!
[GenEvents] Event_0
[EvListenerB] Receiving Event_0
[EvListenerA] Receiving Event_0
[GenEvents] Event_1
[EvListenerA] Receiving Event_1
[EvListenerB] Receiving Event_1
[GenEvents] Event_2
[EvListenerA] Receiving Event_2
Ending EvListenerA!
Ending GenEvents!
为什么我的输出中没有“[EvListenerB] Receiving Event_2”?
EvListenerB 和 Event_2 会发生什么?
有什么想法吗?谢谢
【问题讨论】:
标签: c++ multithreading poco poco-libraries