- 主题:谁能举个函数可重入,但不线程安全的例子
rt
--
FROM 106.3.192.*
锁啊
【 在 wjhtingerx (ca6140) 的大作中提到: 】
: rt
--
FROM 27.91.71.*
有局部变量的?
【 在 wjhtingerx 的大作中提到: 】
: rt
--
FROM 183.95.135.*
锁为啥线程不安全了?
【 在 xiaoju 的大作中提到: 】
: 锁啊
:
--
FROM 117.136.38.*
同一线程肯定不会死锁,多线程就未必了
【 在 wjhtingerx (ca6140) 的大作中提到: 】
: 锁为啥线程不安全了?
--
FROM 27.91.71.*
这里4种例子都有,研究一下对不对
https://en.m.wikipedia.org/wiki/Reentrancy_(computing)
还有人给了个汉诺塔的例子:
https://stackoverflow.com/questions/9116598/why-is-this-code-reentrant-but-not-thread-safe
Reentrant but not thread-safe
The following (somewhat contrived) modification of the swap function, which is careful to leave the global data in a consistent state at the time it exits, is reentrant; however, it is not thread-safe, since there are no locks employed, it can be interrupted at any time:
int tmp;
void swap(int* x, int* y)
{
/* Save global variable. */
int s;
s = tmp;
tmp = *x;
*x = *y; /*If hardware interrupt occurs here then it will fail to keep the value of tmp. So this is also not a reentrant example*/
*y = tmp; /* Hardware interrupt might invoke isr() here. */
/* Restore global variable. */
tmp = s;
}
void isr()
{
int x = 1, y = 2;
swap(&x, &y);
}
【 在 wjhtingerx 的大作中提到: 】
: rt
--
修改:z16166 FROM 123.118.187.*
FROM 123.118.187.*
举不出来,难道线程不是函数重入的一种方式?
多线程都不安全,怎么能说这个函数是可重入的。
另外你是大学老师还是培训机构的老师,怎么总问这类问题。
【 在 wjhtingerx 的大作中提到: 】
: rt
--
FROM 171.82.0.*
一直没找到满意的回答啊,网上各种说法都有,互相矛盾
【 在 lambdago 的大作中提到: 】
: 举不出来,难道线程不是函数重入的一种方式?
: 多线程都不安全,怎么能说这个函数是可重入的。
: 另外你是大学老师还是培训机构的老师,怎么总问这类问题。
: ...................
--
FROM 106.3.192.*
其实主要的歧义来自于可重入的定义。
可重入的概念很早,来自于中断服务程序,那时还没有多线程的时候。当一个函数正在执行时,中断来了,那么当前调用暂停执行,重新进入该函数,第二次执行完毕后 返回第一次调用暂停的地方重新执行。
按照这个定义,可重入和线程安全其实没啥关系。各种组和都会出现。
但是,多线程编程模型的到来,可重入定义就发生了变化。比如posix标准就把可重入定义为多个线程同时调用甚至交替执行也不影响结果。
歧义也就产生了。
【 在 wjhtingerx 的大作中提到: 】
: 一直没找到满意的回答啊,网上各种说法都有,互相矛盾
:
:
: ...................
--来自微水木3.5.11
--
FROM 223.167.169.*