如果计算机程序或例程在其先前的调用完成之前可以被安全地再次调用(即可以同时安全地执行),则将其描述为可重入的 .可重入,计算机程序或例程:
- 必须不保留静态(或全局)非常量数据.
- 不得将地址返回到静态(或全局)非常量数据.
- 必须仅对调用者提供给它的数据有效.
- 不能依赖于锁定单例资源.
- 不得修改自己的代码(除非在自己独特的线程存储中执行)
- 不得调用不可重入的计算机程序或例程.
如何安全地定义?
如果一个程序可以安全地同时执行,它是否总是意味着它是可重入的?
在检查我的代码是否具有重入功能时,我应该记住的六点之间的共同点是什么?
也,
在写这个问题的时候,有一件事情浮现在脑海中:像重入和线程安全这样的术语是否完全绝对,即他们是否有固定的具体定义?因为,如果他们不是,这个问题不是很有意义.
在UNIX系统中,我们知道malloc()是一种不可重入的函数(系统调用).这是为什么?
同样,printf()据说也是不可重入的; 为什么?
我知道re-entrancy的定义,但我想知道为什么它适用于这些函数.是什么阻止他们保证可以重入?
在CI中了解递归函数,但我听说了重入函数.
那是什么?他们之间的区别是什么?
请看整个问题
我知道srand()应该只调用一次,但我的第二个代码段表明这不能解决问题!
我写的程序给了我输出,我无法弄清楚为什么会这样.代码段的不同更改会产生不同的输出.
代码目的:
代码用于omp简单地为3个线程运行一段代码.每个线程必须使用该rand()函数打印3个随机值.因此,共有9项产出.线程0是主线程/主程序的运行流程.线程1和线程2是在线程代码开始时创建的新线程.
代码:
#include<omp.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
#pragma omp parallel num_threads(3)
{
srand(time(NULL));
int i=0;
for(i=0;i<3;i++)
{
printf("\nRandom number: %d by thread %d", rand(), omp_get_thread_num());
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Random number: 17105 by thread 0
Random number: 30076 by thread 0
Random number: 21481 by thread 0
Random number: 17105 by thread 1
Random number: 30076 by thread 1
Random …Run Code Online (Sandbox Code Playgroud)