在我的程序中,我有一个守护线程等待任务并将它们打印到文件中。它的功能是:
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);
}
三个问题:
- 从这里的代码中不清楚,但两者都
daemon()
使用pushNewTask()
相同的pthread_mutex_t
对象 - 这不是问题吗?当守护程序进入睡眠状态(等待)时,它不会解锁互斥锁。 - 几个函数被同一个锁是什么意思
pthread_mutex_lock
?也许只有一个线程可以访问它们中的任何一个?我什么时候应该使用不同的pthread_mutex_t objects
?
谢谢