免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6502 | 回复: 9

[C] 线程锁能在主线程和非主线程之间使用吗? [复制链接]

论坛徽章:
0
发表于 2010-12-10 19:17 |显示全部楼层
我看了APUE2的线程一张,感觉线程的锁pthread_mutex_lock() 是用于pthread_create()出来的线程之间的。
如果我从主线程里面开一个线程,对主线程和这个create线程加锁,那么管用吗?

我想不出来比较周全的测试方案,不知道怎么测试才是合适的。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2010-12-10 20:08 |显示全部楼层
为什么不管用?说个理由看看

论坛徽章:
0
发表于 2010-12-10 20:16 |显示全部楼层
之前看一人发帖说线程锁的问题,他的代码就是在主线程和create的线程加锁的,没细看,现在回想起来了,所以不确定。
这个算理由吗?

如果pthread_mutex_t的范围是全局的,就可以了对吗?

apue2没有特别说明不可以。名字叫线程锁,所以线程之间都可以。对吗?

论坛徽章:
0
发表于 2010-12-12 17:34 |显示全部楼层
管用的,pthread_mutex_lock,只认mutex,不认线程的。如果mutex是在共享内存上的,pthread_mutex_lock甚至可以作为进程锁。

论坛徽章:
0
发表于 2010-12-12 20:42 |显示全部楼层
统一进程间的所有线程都有用。apue上面不是很多例子么

论坛徽章:
0
发表于 2010-12-13 23:25 |显示全部楼层
本帖最后由 LaoLiulaoliu 于 2010-12-13 23:29 编辑

回复 4# zzyong08

谢谢您,说到进程锁。
1. 进程锁是否只能用flock,fcntl(fd, F_SETLK, &lock) 这样的文件加锁,而线程锁可以给变量和语句加锁?
2. pthread_mutex_t 给共享内存加锁,当做进程锁,流程是怎样的?
是这样的吗?

  1. fd = open()
  2. pthread_mutex_lock()
  3. mmap()
  4. pthread_mutex_unlock()
复制代码
3. 如果我用signal + alarm 模型,想给signal的处理函数handler 和 main函数两边加锁,这个是加一个flock的文件锁吗?有什么好的方法吗?


谢谢

论坛徽章:
0
发表于 2010-12-14 09:31 |显示全部楼层
回复 6# LaoLiulaoliu


1.  所谓“锁”,就是合作进程/线程,约定一个“东西”(无论是mutex,还是文件),每次执行某些语句(临界区)的时候,必须先占有这个“东西”,这样这些语句不会同时被多个进程/线程执行。
2. pthread_mutex 进程加锁,我没用过,只是看到apue上这么说过。流程应该是,在共享内存(mmap或shmget)上创建一个mutex,然后用这个mutex加解锁。
3. signal 不同于多进程/线程。signal只是说,信号中断,可能随时发生,但是信号处理函数执行时,被中断的程序是不会执行的。这时锁不起作用。如果希望一段代码不被信号中断,应该屏蔽信号。参考sigprocmask函数

论坛徽章:
0
发表于 2010-12-14 10:45 |显示全部楼层
同意进程的应该都能用把

论坛徽章:
0
发表于 2010-12-14 12:05 |显示全部楼层
回复 7# zzyong08


    非常详细,终于明白了。
    我在程序和信号处理函数里面共用一个文件指针,结果出现错误,看来不能这么用,也不能加锁解决。我的思路错了。谢谢了。

论坛徽章:
0
发表于 2010-12-14 12:06 |显示全部楼层
主次线程都是业务上的概念,线程模型本身不分主次。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP