c语言 互斥锁,线程池中的一个互斥锁有关问题

线程池中的一个互斥锁问题

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,外面怎么能看见呢,然后你这样是想试用队列模型一边插入一边读取,这样有个坏处,对于锁的争用是很明显的,并发是上不去的,你可以试用多队列模型,或者是双缓冲多队列模型,将两个锁分开,只能帮到你这里了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值