您现在的位置: 爱51代码网 >> 范文 >> 文章正文
linux简单线程池中的互斥锁

 /* 工作者线程函数, 从任务链表中取出任务并执行 */  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的虽然是自己分配的内存空间出来!但是没有得到它的地址,也没有办法访问阿!
所以不需要担心。。
互斥锁+条件变量,代码实现很标准。

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    GIS用百度行政区域的经纬度直接画
    不小心卸载了.net 4 extend,vs2
    C#byte【】里的数转换成string时
    C#的session取不到值
    java如何判断一个字符串里的数字
    随机找出24个不一样的字,在把一
    java怎么实现html转为pdf
    lotus数据列表文档个数如何实时统
    lotus代理中LS如何将字符串保存到
    在lotus BS系统里怎样方便实现统
    GIS用百度行政区域的经纬度直接画
    不小心卸载了.net 4 extend,vs2
    C#byte【】里的数转换成string时
    C#的session取不到值
    java如何判断一个字符串里的数字
    java怎么实现html转为pdf
    lotus数据列表文档个数如何实时统
    在lotus BS系统里怎样方便实现统
    undefined reference timer_crea
    linux文件/usr/lib破坏了,还原后
    linux myeclipse hibernate 
    每次EPOLLIN事件都会带一次E
    虚拟机通过NAT与主机共享网络
    Make sure that you are log
    linux240:~ # rpm -qa sftp
    linux怎么进入桌面模式
    Missing Dependency: libQtG
    linux非抢占的模式下,如果时
    C语言ascii码如何做除法运算
    C语言ascii码如何做除法运算
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |