在LINUX里,同一个进程下的多个线程都在一个地址空间里,那可不可以在A线程中调用C函数,在B线程中调用C函数,当两个线程同时调用了C函数,会发生什么问题吗?
LINUX里有什么办法可以设置某个函数为可重入函数吗?还是说,LINUX的线程机制可以保证两个线程不会同时调用一个函数?
7 个解决方案
#1
可以调用,前提是这个函数是可重入的--这样才没有副作用。
关于lz所担心的问题,建议la去看看编译原理相关知识,弄明白什么叫代码段,什么叫堆栈
关于lz所担心的问题,建议la去看看编译原理相关知识,弄明白什么叫代码段,什么叫堆栈
#2
可以用锁,信号量等来保证对临界代码的访问。
#3
可重入函数要确保函数中没有使用静态变量,另外也不要调用其它线程不安全的函数
从书上可以找到线程安全函数的列表
从书上可以找到线程安全函数的列表
#4
我也是来学习的
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
#5
同意
#6
多谢各位,现在比较清楚了
#7
哎呀,高手比比皆是啊。。
#1
可以调用,前提是这个函数是可重入的--这样才没有副作用。
关于lz所担心的问题,建议la去看看编译原理相关知识,弄明白什么叫代码段,什么叫堆栈
关于lz所担心的问题,建议la去看看编译原理相关知识,弄明白什么叫代码段,什么叫堆栈
#2
可以用锁,信号量等来保证对临界代码的访问。
#3
可重入函数要确保函数中没有使用静态变量,另外也不要调用其它线程不安全的函数
从书上可以找到线程安全函数的列表
从书上可以找到线程安全函数的列表
#4
我也是来学习的
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
#5
同意
#6
多谢各位,现在比较清楚了
#7
哎呀,高手比比皆是啊。。