私のプログラムには、タスクを待機してファイルに出力するデーモンスレッドがあります。その機能は次のとおりです。
void * deamon(void *) {
while(true) {
pthread_mutex_lock(manager->getLock());
while(!manager->isPending()) {
if (manager->isClosing()) {
pthread_exit(NULL);
}
pthread_cond_wait(manager->getCond(), manager->getLock());
//check that condition if met - surprises may occur!
}
//WRITE TO FILE HERE
pthread_mutex_unlock(manager->getLock());
}
return NULL;
}
ご覧のとおり、保留中のタスクがない場合、デーモンは新しいタスクを待機します。新しいものを入手したら、それを別のクラスのデータベースにプッシュし(デーモンはクラスにありません)、次のようにシグナルを送信します。
void Manager::pushNewTask(Task * task) {
pthread_mutex_lock(_lock);
map<int,Task *>::iterator it = _tasks->end();
_tasks->insert(it,make_pair(task->getId(),task));
// At the first time a signal is sent with no need
if (_tasks->size() == 1) {
_pending = true;
pthread_cond_signal(_cond); //SEND SIGNAL TO DAEMON THREAD
}
pthread_mutex_unlock(_lock);
}
3つの質問:
- ここのコードからは明らかではありませんが、両方とも同じオブジェクト
daemon()
を使用しています-それは問題ではありませんか?デーモンがスリープ(待機)すると、ミューテックスのロックは解除されません。pushNewTask()
pthread_mutex_t
- 複数の機能が同じものでロックされているとはどういう意味
pthread_mutex_lock
ですか?たぶん、1つのスレッドだけがそれらのいずれかにアクセスできますか?いつ違うものを使うべきpthread_mutex_t objects
ですか?
ありがとう