大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
可以使用全局变量、静态变量。关键是不是“只读”。如果只读,那怎么用都行。如果有写的操作,最好避开,实在避不开就要用信号量等机制防止多线程冲突。
创新互联专业为企业提供浦江网站建设、浦江做网站、浦江网站设计、浦江网站制作等企业网站建设、网页设计与制作、浦江企业网站模板建站服务,十载浦江做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
另外就是调用的函数要线程安全, thread-safe.具体那些函数线程安全,需要查阅手册。
若一个程序或子程序可以安全的被并行执行,则称其为可重入(reentrant或re-entrant)的;即,当该子程序正在运行时,可以再次进入并执行它。若一个函数是可重入的,则该函数:不能含有静态(全局)非常量数据。 不能返回静态(全局)非常量数据的地址。 只能处理由调用者提供的数据。 不能依赖于单实例模式资源的锁。 不能调用不可重入的函数。 多'用户/对象/进程优先级'以及多进程一般会使得对可重入代码的控制变得复杂。同时,IO代码通常不是可重入的,因为他们依赖于像磁盘这样共享的、单独的资源。可重入性是函数编程语言的关键特性之一。 例子在以下的C语言代码中,函数f和函数g都不是可重入的。int g_var = 1;int f(){ g_var = g_var + 2; return g_var;}int g(){ return f() + 2;}以上代码中,f使用了全局变量 g_var,所以,如果两个线程同时执行它并访问g_var,则返回的结果取决于执行的时间。因此,f不可重入。而g调用了f,所以它也不可重入。稍作修改后,两个函数都是可重入的:int f(int i){ return i + 2;}int g(int i){ return f(i) + 2;}
一、可重入函数
1)什么是可重入性?
可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入 函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。
2)可重入函数:
不为连续的调用持有静态数据。
不返回指向静态数据的指针;所有数据都由函数的调用者提供。
使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
如果必须访问全局变量,记住利用互斥信号量来保护全局变量。
绝不调用任何不可重入函数。
3)不可重入函数:
函数中使用了静态变量,无论是全局静态变量还是局部静态变量。
函数返回静态变量。
函数中调用了不可重入函数。
函数体内使用了静态的数据结构;
函数体内调用了malloc()或者free()函数;
函数体内调用了其他标准I/O函数。
函数是singleton中的成员函数而且使用了不使用线程独立存储的成员变量 。
总的来说,如果一个函数在重入条件下使用了未受保护的共享的资源,那么它是不可重入的。
从字面上的意思就是,可以重复进入。可重入是在多任务系统下的概念,意思是这个函数可以在运行到任意位置的时候被中断去执行其他任务,并且返回的时候不会出现任何错误。为什么在多任务的时候才有这种概念。我举个例子,我们定义了一个叫func的函数,同时定义了两个线程,两个线程都调用了func,那么就存在这种情况,线程1正在执行func的时候,线程2开始执行func了,导致两个时刻两个线程都在执行func,正常情况下两个都能执行成功,并且没有错误,我们就认为func是可重入的。但是如果func使用了公共资源,比如读取同一个文件,或者访问了同一个全局变量,这时候就会导致两个线程访问公共资源时发生冲突,这样的函数就是不可重入的。