私はネットワークプログラミングで作業しており、スレッドプールを作成しました。基本的にmutexロックと条件変数を持つキューがあり、5つの子スレッドが競合してキューから作業を取得します。それは、条件変数でロックやロック解除を正しく実行しているようです。別のスレッドで同時に関数を呼び出す
しかし、問題は、私が子スレッドから関数を呼び出すと、関数(fromByte)に対して1つのスレッドしか動作できないということです。たとえば、スレッド1が関数を呼び出した場合、もう一方のスレッドは関数に入ることができません。
void WorkHandler::workLoop(){
printf("WorkHandler::workLoop, called\n");
while(m_workHandlerRun){
Work *work = getWork();
char *pdata = work->getMsg();
/*
* Get type only
*/
unsigned char type = pdata[0];
printf("WorkHandler::workLoop, type %d\n", type);
Packet *packet = m_packetFactory->createInstance(static_cast<PACKET_TYPES>(type));
packet->fromByte(pdata);
}
}
これは、子スレッドが実行されており、工場から適切なクラスインスタンスを取得した後にfromByte()を呼び出す作業ループです。私がログステートメントを見ると、fromByte関数で1つのスレッドしか動作することができず、スレッドが終了すると他のスレッドがその関数で動作することができます。言い換えれば、スレッドが現在機能している場合、他のスレッドはスレッドが作業を終了するまで待機する。
bool WorkHandler::initThreads(){
for(int i=0; i < m_maxThreads; i++){
pthread_t *thread(new pthread_t);
m_workThreadList.push_back(thread);
if(pthread_create(thread, NULL, runWorkThread, reinterpret_cast<void *>(this))!=0){
perror("WorkHandler::initThreads, pthread_create error \n");
return false;
}
pthread_detach(*thread);
}
return true;
}
これはスレッドを生成する方法で、runWorkThreadはworkLoop関数を呼び出す静的メソッドです。子スレッドが同時に機能するようにコードを修正するにはどうしたらいいですか?事前に感謝..
編集
私はまた、このクラスはMutexdCondtionクラスを拡張し、私は
bool MutexCondition::init(){
printf("MutexCondition::init called\n");
pthread_mutex_init(&m_mut, NULL);
pthread_cond_init(&m_con, NULL);
return true;
}
bool MutexCondition::destroy(){
pthread_mutex_destroy(&m_mut);
pthread_cond_destroy(&m_con);
return true;
}
bool MutexCondition::lock(){
pthread_mutex_lock(&m_mut);
return true;
}
bool MutexCondition::unLock(){
pthread_mutex_unlock(&m_mut);
return true;
}
bool MutexCondition::wait(){
pthread_cond_wait(&m_con, &m_mut);
return true;
}
bool MutexCondition::signal(){
pthread_cond_signal(&m_con);
return true;
}
これはすべてireleaventです。どのようにメソッドをロックしていますか? –