能力值:
( LV2,RANK:10 )
|
-
-
2 楼
自己百度一下。
[c#] 多线程下,如何保证一个线程的一组操作不被中断
一旦执行了进入了这段代码区,就保证让这段代码全部执行
中间不会被打断,执行完这段代码后,其他线程可以执行。
==========
线程保持不中断的理由,只有2个
1、要求严格时间的,这种应用在应用层基本不可能出现。
2、要求对某个共享资源进行保护。
对于2来说,用lock方式保护所有线程可能访问的共享资源就可以了!在应用层基本上不可能存在要求线程不被抢先的需求!!!!!
==============
有人能详细解释一下吗。
我要求一段代码执行不能被中断,这是必须的,就没有办法了吗?
看来我要进入驱动级编程保证代码不被中断吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
原因是这样的,
该线程独占了一个资源,它必须执行一段代码后,释放该资源,别的线程才能获得该资源,执行下去。否则,如果该线程占有一个资源后,没有执行60条就被中断了,那其他线程永远处于等待该资源被释放的状态,也就是说,一旦中断该线程,所有其他线程都在空转等待之中,这是不行的。
如果该线程执行60条以后再被windows调度系统挂起,那没关系,该线程已经把资源释放了,其他线程可以获得该资源继续执行,而不必空转等待。
所以说,执行60条以后再中断是必须的,千万不要执行30条就中断,那整个系统被挂起。
怎么办?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
标题: 多线程,如何保证一段代码不被打扰的执行完?
--------------------------------------------------------------------------------
要写一个多线程的函数,其中在主线程中,有一段代码希望连续执行完,中间不会被其他线程中断,类似于Critical Section。
请教各位,linux中有类似的函数吗?
=================================
引用:
作者: luckyrex
其实这个“临界区”是我从uCOS中借用的词,可能不准确。我想表达的意思就是在这个区域内,代码的执行不会被打断。
孤陋寡闻了,不会被打断我们一般称之为"原子操作"
引用:
如果只能用开关中断的话,请教一下如何实现?谢谢
开关中断不是一个好办法,不过没有想到更好的办法.
如果实在要用,只能用汇编指令了.不同的cpu有不同的开关中断的指令,x86 为cli/sti
============================
找到linux论坛去了,最后答案也是cli/sti,可是酉时特权指令。
看来和我遇到同样问题的朋友不少,“执行一段代码不被打断”,这么简单的要求都不能实现吗?
操作系统干什么吃的。要你不要用时钟中断粗暴的打断我的线程的运行,等到执行60条以后再打断,
难道不能实现ok吗?怎么办?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
自己设想了,
看了callgate,调用门相关文章,
决定自己设计一个调用门,
从ring3 call调用门。
call调用门进入ring0以后 ,在ring0层,cli...... ===sti,然后调用门返回ring03,不知道可行否?
|
能力值:
( LV12,RANK:250 )
|
-
-
6 楼
cli 与 sti在多核机器上,也被描述说,是非安全的独占。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
哦,cli,sti在多核上不能安全独占?
能讲下原理么?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
这类应用建议还是考虑ARM之类的片子上面裸奔。
可控性强一点。
|
|
|