当前位置: 技术问答>linux和unix
简单线程池中的互斥锁问题
来源: 互联网 发布时间:2017-05-01
本文导语: /* 工作者线程函数, 从任务链表中取出任务并执行 */ 12: static void* 13: thread_routine(void *arg) 14: { 15: tpool_work_t *work; 16: 17: while(1) { 18: /* 如果线程池没有被销毁且没...
/* 工作者线程函数, 从任务链表中取出任务并执行 */
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赋值的过程中,任务链表被互斥锁锁住了,其他线程不会修改任务链表,work赋值完成之后,才解锁任务链表,之后不管任务链表怎么变,work的值都不会变了
|
不会阿!work的虽然是自己分配的内存空间出来!但是没有得到它的地址,也没有办法访问阿!
所以不需要担心。。
所以不需要担心。。