由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问个问题,关于critical section的实现,用C
相关主题
问个函数指针指向操作符的问题为什么不能成功排序
C语言里面的register变量能否进行取地址操作? (转载)请教: 用stable_sort 在VC++下通过但在g++下通不过
王垠:程序设计里的“小聪明”(ZZ)一个c++小问题
Go什么时候可能支持Generic?问个c++的template的问题
how to create interface "operator=="还是咱们这儿,亲。
c++ private 问题这两种容器定义形式有区别吗?
用STL map的时候怎么自己定义大小比较的关系发现一个有趣的现象。
C++ template questionscala很牛啊
相关话题的讨论汇总
话题: critical话题: section话题: thread话题: 问个问题话题: bool
进入Programming版参与讨论
1 (共1页)
k***s
发帖数: 277
1
记得以前的一本operating system的教材 中有这个的C代码,
没有用到任何硬件上的特殊指令,完全的C程序,但是可以很好的
完成只允许一个调用者进入,而另一个(几个)会失败返回。
现在到处找不到这个程序了,请问有没有人知道?
多谢
t****t
发帖数: 6806
2
这个不可能的啦, 现在的硬件和编译器比原来复杂好多了, 不靠特殊支持已经做不到了.

【在 k***s 的大作中提到】
: 记得以前的一本operating system的教材 中有这个的C代码,
: 没有用到任何硬件上的特殊指令,完全的C程序,但是可以很好的
: 完成只允许一个调用者进入,而另一个(几个)会失败返回。
: 现在到处找不到这个程序了,请问有没有人知道?
: 多谢

k***s
发帖数: 277
3
这个算法在现在没有什么实际的价值,只是在理论上有意义
在Operating System Concepts上查到了,设计的很巧妙。
// i, j are two processes try to get into critical section
do {
flag[i] = true;
turn = j;
while (flag[j] && turn==j);
// critical section
flag[i] = false;
} while (1);

了.

【在 t****t 的大作中提到】
: 这个不可能的啦, 现在的硬件和编译器比原来复杂好多了, 不靠特殊支持已经做不到了.
t****t
发帖数: 6806
4
这个在现在的硬件上不会有用的. 你在C语言里写的执行顺序, 内存读写, CPU在执行的
时候全都不给你保证. 执行的顺序可以打乱, 内存读写可以跳过或者多出, 总之CPU只
保证单线程语义正确, 不加lock或者fence的话在多线程环境下几乎一定是错的.

【在 k***s 的大作中提到】
: 这个算法在现在没有什么实际的价值,只是在理论上有意义
: 在Operating System Concepts上查到了,设计的很巧妙。
: // i, j are two processes try to get into critical section
: do {
: flag[i] = true;
: turn = j;
: while (flag[j] && turn==j);
: // critical section
: flag[i] = false;
: } while (1);

e****d
发帖数: 895
5
Without proper atomic operations, locking and memory model,
this implementation is not practical.
Even the following example is not thread-safe,
thread 1:
bool a;
a = true;
if (a)
{
do_something();
}
thread 2:
bool b
b = false;
if (!b)
{
do_something2();
}

【在 k***s 的大作中提到】
: 这个算法在现在没有什么实际的价值,只是在理论上有意义
: 在Operating System Concepts上查到了,设计的很巧妙。
: // i, j are two processes try to get into critical section
: do {
: flag[i] = true;
: turn = j;
: while (flag[j] && turn==j);
: // critical section
: flag[i] = false;
: } while (1);

1 (共1页)
进入Programming版参与讨论
相关主题
scala很牛啊how to create interface "operator=="
STL怎样同时重载()和< ?c++ private 问题
about critical section用STL map的时候怎么自己定义大小比较的关系
求助:请推荐Operating System的经典教材 (转载)C++ template question
问个函数指针指向操作符的问题为什么不能成功排序
C语言里面的register变量能否进行取地址操作? (转载)请教: 用stable_sort 在VC++下通过但在g++下通不过
王垠:程序设计里的“小聪明”(ZZ)一个c++小问题
Go什么时候可能支持Generic?问个c++的template的问题
相关话题的讨论汇总
话题: critical话题: section话题: thread话题: 问个问题话题: bool