LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: luckyrex

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

[复制链接]
发表于 2005-9-23 16:08:50 | 显示全部楼层
那要如何定义特权指令呢?我觉得有限制的就算特权了,可能跟手册上privilege表达的意思不太一样。另外我后来的话里也没使用“特权指令”这个词,只是说这些指令不能随便用而已。
第二段话里第一句的意思是即使cli/sti可以影响中断,也是仅仅影响maskable external interrupts,这个maskable是硬件和操作系统定下来的,用户进程无法改动,除0还有其他段越界之类的异常是由CPU产生的,无法被这个指令影响(操作系统可以响应这些中断以实现虚拟内存或其他的保护功能,所以不是完全不活动);第二句是说如果VM被置位,那么sti/cli影响的是VIF而不是IF(这句话rickxbx老兄好像理解有误),就是说仍然不能影响真正的中断,哪怕是外部中断。总而言之,就是sti/cli在普通用户进程下即使能用,也达不到楼主想要得效果。
BTW,讨论了半天指令,跟楼主的问题扯远了点,咱们还是在人家的操作系统下面。想用sti/cli实现楼主的问题,原则上来说可以,但是要自己手动把操作系统改一下,当然这个程序在别的机器上就跑不对了;或者不改操作系统,自己构造个中断(不知道在Linux下面行不行),切到0级去就能sti/cli了,想用什么指令用什么指令,用一个扔一个^_^。
回复 支持 反对

使用道具 举报

发表于 2005-9-23 16:23:41 | 显示全部楼层
Post by gamedragon
那要如何定义特权指令呢?我觉得有限制的就算特权了,可能跟手册上privilege表达的意思不太一样。另外我后来的话里也没使用“特权指令”这个词,只是说这些指令不能随便用而已。
第二段话里第一句的意思是即使cli/sti可以影响中断,也是仅仅影响maskable external interrupts,这个maskable是硬件和操作系统定下来的,用户进程无法改动,除0还有其他段越界之类的异常是由CPU产生的,无法被这个指令影响(操作系统可以响应这些中断以实现虚拟内存或其他的保护功能,所以不是完全不活动);第二句是说如果VM被置位,那么sti/cli影响的是VIF而不是IF(这句话rickxbx老兄好像理解有误),就是说仍然不能影响真正的中断,哪怕是外部中断。总而言之,就是sti/cli在普通用户进程下即使能用,也达不到楼主想要得效果。
BTW,讨论了半天指令,跟楼主的问题扯远了点,咱们还是在人家的操作系统下面。想用sti/cli实现楼主的问题,原则上来说可以,但是要自己手动把操作系统改一下,当然这个程序在别的机器上就跑不对了;或者不改操作系统,自己构造个中断(不知道在Linux下面行不行),切到0级去就能sti/cli了,想用什么指令用什么指令,用一个扔一个^_^。


呵呵,偏题太远了
对于楼主的要求,似乎并没有什么好办法
回复 支持 反对

使用道具 举报

发表于 2005-9-24 15:17:44 | 显示全部楼层

关于线程挂起

。。。。。。。。
E.4: How can I suspend and resume a thread from another thread? Solaris has the thr_suspend() and thr_resume() functions to do that; why don't you?
The POSIX standard provides no mechanism by which a thread A can suspend the execution of another thread B, without cooperation from B. The only way to implement a suspend/restart mechanism is to have B check periodically some global variable for a suspend request and then suspend itself on a condition variable, which another thread can signal later to restart B.

Notice that thr_suspend() is inherently dangerous and prone to race conditions. For one thing, there is no control on where the target thread stops: it can very well be stopped in the middle of a critical section, while holding mutexes. Also, there is no guarantee on when the target thread will actually stop. For these reasons, you'd be much better off using mutexes and conditions instead. The only situations that really require the ability to suspend a thread are debuggers and some kind of garbage collectors.

If you really must suspend a thread in LinuxThreads, you can send it a SIGSTOP signal with pthread_kill. Send SIGCONT for restarting it. Beware, this is specific to LinuxThreads and entirely non-portable. Indeed, a truly conforming POSIX threads implementation will stop all threads when one thread receives the SIGSTOP signal! One day, LinuxThreads will implement that behavior, and the non-portable hack with SIGSTOP won't work anymore.
回复 支持 反对

使用道具 举报

发表于 2005-9-28 17:09:41 | 显示全部楼层

suspend/resume and mutex

Post by 弥敦路九号
。。。。。。。。


同意这位的solutions.

mutex可以让你控制只有一个线程访问共享数据,或者运行关键代码。
我不知道你希望其他线程在主线程运行关键代码的时候必须等候的原因是什么? 难道真的时候做thread debugger/monitor吗?

如果你坚持需要在运行主线程的关键代码的时候其他线程暂停,那么就用thread suspend/resume在进入临届代码前后来手工停止和启动其他所有线程,但是请不要忘记使用pthread_setcancelstate来控制你的所有线程的临界代码,否则会出大乱子。

uCOS的enter_critical and exit_critical 函数的设计不可能放到通用操作系统,否则一个烂程序员随便写一个阻塞或者死循环在中间,系统就没用了。
回复 支持 反对

使用道具 举报

发表于 2005-9-28 20:57:21 | 显示全部楼层
实时优先级!一了百了!
如果这个是你想要的
man sched_setscheduler
SCHED_FIFO
priority 0
回复 支持 反对

使用道具 举报

发表于 2005-9-30 14:37:42 | 显示全部楼层
楼主的要求是“中间不会被其他线程中断”,并认为“将其他线程挂起的确是个办法”,是不是可以理解为“允许这个线程被系统中其它的进程以及底层中断打断”?

如果是这样,就说明不能被打断的原因是线程与线程之间存在的某种关系(比如存在临界区)可能导致负面的结果,而不是这个线程本身真的需要严格的连续执行。那么你应该找到这个关系(比如临界区)并用常规的方法(比如线程互斥与同步)去解决它,而不是粗暴地挂起所有其它线程。
回复 支持 反对

使用道具 举报

发表于 2005-10-1 13:01:46 | 显示全部楼层
mutex是同步用的,与luckyrex所要求的线程不被中断有什么关系。

不过进程调度是操作系统的功能,要想停止调度可能不是会那么简单吧。

luckyrex到底是要解决什么问题的?
回复 支持 反对

使用道具 举报

发表于 2005-10-8 13:04:19 | 显示全部楼层
26楼说的不错,楼主其实只是这些线程之间不能同时执行而已,不是需要保证关键代码在一个时间片内执行。那其实就是信号量的问题了。主线程执行时锁住,其它线程执行时检查信号量的做法不能满足的原因在于,当其它线程先于主线程执行时,如何同步的问题。其实只要用2个信号量,主线程启动时检查是否有其它线程执行,并置另一信号量。其它线程在看到主线程有执行请求时,就不能启动,这样应该能满足楼主的要求吧?
回复 支持 反对

使用道具 举报

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

本版积分规则

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