【发布时间】:2016-01-31 12:21:44
【问题描述】:
我正在尝试开发一个 C++ 软件,它有 1 个线程作为控制器(比如控制器)和 8 个其他线程(子线程)将通过 TCP/IP 进行发送/接收。
我的软件是循环运行的:
- 一开始,子线程无限循环运行,在循环中等待来自控制器的 START 信号。如果它们被来自控制器的信号唤醒,它们将执行发送/接收过程。发出信号后,控制器将等待来自子线程的停止信号。
- 在完成发送/接收后,它们每个都会向控制器发送一个停止信号。如果控制器接收到足够的停止信号(8 个子线程的 8 个停止信号)。它将复制数据,然后再次启动该过程(下一个循环)。
为此,我从一个非常基本的步骤开始我的软件:控制器线程和一个子线程,而这个子线程不做任何事情。 (如果一切正常,我会继续前进):
- 换句话说,控制器在子线程等待时向子线程发送 START 信号。
- 子线程收到 START 信号后立即发回 STOP 信号。
我先运行这个软件1000次,有时候效果很好,有时候不行,经常死机。
我想知道为什么会这样。
为了更好的解释,请参考我的代码:
#include "CxxUtilities/CxxUtilities.hh"
using namespace std;
CxxUtilities::Condition StartSignal;
CxxUtilities::Condition StopSignal;
// declare a class of tx_thread, open, alive, wait for signal from controller thread //
class ChildThread: public CxxUtilities::StoppableThread{
public:
void run(){
cout << "started tx_thread" << endl;
while(!stopped){
/* wait for signal from main thread */
cout << "sub:wait for main...";
StartSignal.wait();
cout << "sub:done, \n";
/* signal to main thread */
StopSignal.signal();
cout << "sub:signal sent, \n";
}
}
};
int main(int argc, char* argv[]) {
using namespace CxxUtilities;
int i;
int Events = atoi(argv[1]);
// declear threads //
ReadingThread* thread[20];
thread[0] = new ReadingThread;
thread[0]->start();
usleep(1000);
for (i=0; i<Events; i++){
cout << "\nevent#" << i+1 << ", ";
/* send start signal to sub thread */
StartSignal.broadcast();
cout << "main:signal sent, \n";
/* wait for stop signal from sub thread */
cout << "main:wait for sub ...";
StopSignal.wait();
cout << "main:done, \n";
}
cout << endl;
}
如果我将此软件修改为仅向子线程发出控制器信号或仅向控制器发出子线程信号,则它可以正常工作。 当我们使用来自 2 个 trheads 的 2 个信号时,您对为什么线程冻结有任何想法吗?
在这个软件中,有两个头文件被用到,分别是Thread.hh和Condition.hh
这里是Condition.hh头文件中singal()和wait()的一部分:
void signal(){
mutex.lock();
pthread_cond_signal(&condition);
mutex.unlock();
void wait(){
mutex.lock();
pthread_cond_wait(&condition,mutex.getPthread_Mutex_T());
mutex.unlock();
}
【问题讨论】:
标签: c++ multithreading