LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2713|回复: 27

多线程,如何保证一段代码不被打扰的执行完?

[复制链接]
发表于 2005-9-22 10:28:41 | 显示全部楼层 |阅读模式
要写一个多线程的函数,其中在主线程中,有一段代码希望连续执行完,中间不会被其他线程中断,类似于Critical Section。

请教各位,linux中有类似的函数吗?
发表于 2005-9-22 11:59:51 | 显示全部楼层
用锁机制或者信号量等,具体见apue
回复 支持 反对

使用道具 举报

发表于 2005-9-22 12:05:27 | 显示全部楼层
google for "pthread mutex"
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-22 13:16:15 | 显示全部楼层
谢谢各位的回答,其实开始想到了用mutex,可是没想清楚:

比方说我在主线程进入关键代码前锁住信号量,然后进入关键代码,这时CPU切换到另一个线程,
可是我不知道是从其他线程的哪个地点进入的!除非我在其他线程的每句代码后面都检查一下信号
量是否被锁住,否则还是有可能会执行其他线程的代码!

不知道我是哪里没有想通,请各位指点。
回复 支持 反对

使用道具 举报

发表于 2005-9-22 13:42:09 | 显示全部楼层
不是没想通,是没搞明白mutex是怎么个东西。
这个mutex被锁住之后,其他要访问这个mutex的操作全被挂起,直到被解锁,如果没这个功能还要它干吗。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-22 14:03:39 | 显示全部楼层
谢谢gamedragon的回答。我想我知道mutex的功能,不过还是没想明白为什么它可以。

我要实现的是这样的功能:

一个多线程的程序,各线程全部是死循环,根据一个全局标志位退出。一般各线程自己做自己的事情。
但是在主线程中,有一段代码,我希望能不受干扰的执行完。也就是说,在执行这段代码期间,不要
有CPU切换的过程。即使切换到了其他线程,也要马上退出。

正如我上个帖子说的,如果用mutex锁,因为我不知道CPU切换到另一个线程时,是从其他线程的哪
个地点进入的!有可能切换到其他线程的任何一句代码开始执行。除非我在其他线程的每句代码后面
都写一句访问mutex的代码,把其他线程挂住!不过这种做法显然是不现实的。

也许是我还没想清楚,请各位指点!
回复 支持 反对

使用道具 举报

发表于 2005-9-22 14:11:48 | 显示全部楼层
看来你还是不知道mutex的功能
你把mutex当一个普通的全局变量了吧
回复 支持 反对

使用道具 举报

发表于 2005-9-22 14:56:42 | 显示全部楼层
按照楼主解释,不应该使用"临界区"一词
临界区一般指多个线程可访问的代码段.
回复 支持 反对

使用道具 举报

发表于 2005-9-22 16:13:03 | 显示全部楼层
大概明白楼主的意思了,要是这种情况,除非在执行这段代码之前关闭中断,执行完之后在开中断,这样就绝对不会执行到其他线程里的代码了。
我目前只能想到这个方法。

另外,mutex的实现是在内核空间里实现的,其实现就是靠开关中断以及原子操作完成的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-22 16:52:55 | 显示全部楼层
x11 :
    呵呵,我非常清楚mutex是个什么东西,我今天都在研究多线程的内容。

rickxbx :
  其实这个“临界区”是我从uCOS中借用的词,可能不准确。我想表达的意思就是在这个区域内,代码的执行不会被打断。

gamedragon :
  你说得很对!我之所以用“临界区”这个词,就是因为在uCOS中有个OS_ENTER_CRITICAL()
和OS_EXIT_CRITICAL()这两个函数。被这两个函数包起来的代码,运行是不会被打断的。而这两个函数的实现,就是开中断和关中断!

其实我也想到用开关中断,跟uCOS中一样,只是想知道在linux中是不是有其他的函数能实现这一点。

如果只能用开关中断的话,请教一下如何实现?谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表