线程池中的一个互斥锁问题
12: static void*
13: thread_routine(void *arg)
14: {
15: tpool_work_t *work;
16:
17: while(1) {
18: /* 如果线程池没有被销毁且没有任务要执行,则等待 */
19: pthread_mutex_lock(&tpool->queue_lock);
20: while(!tpool->queue_head && !tpool->shutdown) {
21: pthread_cond_wait(&tpool->queue_ready, &tpool->queue_lock);
22: }
23: if (tpool->shutdown) {
24: pthread_mutex_unlock(&tpool->queue_lock);
25: pthread_exit(NULL);
26: }
27: work = tpool->queue_head;
28: tpool->queue_head = tpool->queue_head->next;
29: pthread_mutex_unlock(&tpool->queue_lock);
30: //这里如果其他线程先获得锁,然后运行之后改变了work的值,而后下面这行代码再运行,会调用新的值么?
31: work->routine(work->arg);
32: free(work);
33: }
34:
35: return NULL;
36: }
这儿有个疑问。互斥锁解锁后,其他并行的线程如果此时获得锁并修改了work的值,那么程序不是出问题了么??
互斥锁
分享到:
------解决方案--------------------
你的这个work是局部变量,既不是static,也不是const,外面怎么能看见呢,然后你这样是想试用队列模型一边插入一边读取,这样有个坏处,对于锁的争用是很明显的,并发是上不去的,你可以试用多队列模型,或者是双缓冲多队列模型,将两个锁分开,只能帮到你这里了