文件读写线程安全|java线程安全性问题



A. python的文件write是多线程安全的吗

FileIO objects are thread-safe to the extent that the operating system calls (such as read(2) under Unix) they are wrapping are thread-safe too. Binary buffered objects (instances of BufferedReader, BufferedWriter, BufferedRandom and BufferedRWPair) protect their internal structures using a lock; it is therefore safe to call them from multiple threads at once. TextIOWrapper objects are not thread-safe.

B. Windows下的PHP安装文件线程安全和非线程安全的区别

非线程安全版本php适用在使用CGI以及fastCGI的web服务器上,如nginx,lighttpd以及IIS的CGI模式下线程安全版本php适用在使用ISAPI或者mole的web服务器上,如IIS的ISAPI模式或者apache mole模式安装哪个版本看你使用的web服务器而定

C. 多线程的主要用处是什么

多线程是指从软件或者硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机,多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,此独立运行的程序片段叫作“线程”,利用其编程的概念就叫作“多线程处理”,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。多线程模式的作用如下:1、一个采用了多线程技术的应用程序可以更好地利用系统资源。其主要优势在于充分利用了CPU的空闲时间片,可以用尽可能少的时间来对用户的要求做出响应,使得进程的整体运行效率得到较大提高,同时增强了应用程序的灵活性。2、更为重要的是,由于同一进程的所有线程是共享同一内存,所以不需要特殊的数据传送机制,不需要建立共享存储区或共享文件,从而使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。3、使用线程可以把占据长时间的程序中的任务放到后台去处理。4、用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。5、程序的运行速度可能加快。6、在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。

D. printf是线程安全的吗

printf最终还是要写入 stdout文件中的,因此输出到文件是线程安全的(系统支持)。但是当其参数中存在指针类型(字符串指针)时,在多线程环境下可能crash。比如一个线程中打印时所用的字符串(动态分配),在另一个线程中被delete,这样造成第一个线程打印时会报错。结论是printf的数据输出为线程安全,但数据输入可能会出现脏读而引发线程安全问题。

E. Windows下的PHP安装文件线程安全和非线程安全的区别

Windows下的PHP版本分两种:线程安全版本与非线程安全版本。要论两者的区别,详细论说起来比较麻烦,从使用者的角度,记住什么时候用哪种版本的区别就可以了吧:1、windows + IIS + FastCGI :使用非线程安全版本。解释:以FastCGI方式安装PHP时,PHP拥有独立的进程,并且FastCGI是单一线程的,不存在多个线程之间可能引发的相互干扰(这种干扰通常都是由于全局变量和静态变量导致的)。由于省去了线程安全的检查,因此使用FastCGI方式比ISAPI方式的效率更高一些。2、windows + IIS + ISAPI :使用线程安全版本。解释:PHP以ISAPI方式安装时,PHP没有独立的进程,而是作为DLL被IIS加载运行的,即是依附于Web服务器进程的。当Web服务器运行在多线程模式下(IIS正是这种情况),PHP自然也就运行在多线程模式下。只要是在多线程模式下运行,就可能存在线程安全问题,因此应选择PHP的线程安全版本。3、windows + Apache + PHP(模块) :使用线程安全版本。解释:如果你要在Apache中以模块方式安装PHP,则你应该使用PHP的线程安全的版本。原因是当PHP作为Apache的模块安装时,PHP没有独立的进程,而是作为模块以DLL的形式被加载到Apache中的,是随Apache的启动而启动的,而Windows下的Apache为多线程工作模式,因此PHP自然也就运行在多线程模式下。因此,这种情况下应使用PHP的线程安全版本。4、windows + Apache + PHP(ISAPI) :使用线程安全版本。解释:由于以ISAPI方式来安装PHP时,PHP也没有独立的进程,也是作为模块被加载到Apache中的,因此,同样也需要使用PHP的线程安全版本。一般不建议在Apache中以ISAPI方式来安装PHP,原因是到目前为止,Apache通过mod_isapi.so模块来实现的ISAPI功能并不完整,并未完整实现微软对ISAPI所制定的全部规范。5、windows + Apache + PHP(FastCGI) :使用非线程安全版本。解释:如果你要在Apache中以FastCGI方式使用PHP,则同在IIS中使用FastCGI的PHP的情况一样,你应该使用PHP的非线程安全的版本。原因是在Apache中以FastCGI方式安装PHP时,PHP拥有独立的进程,并且FastCGI是单一线程的,故应使用PHP的非线程安全版本以提高性能。以上资料总结相关资料,分条明细,供选择。

F. LinuxC++如何编写线程安全库

LinuxC++编写线程安全库dll的方法:1、动态库只有一个导出函数。这种情况下编写函数时,只需要考虑不要有冲突的全局数据就可以了。这里的全局数据包括了在堆中分配的数据块和静态全局变量等。如果存在这样的全局数据,那么进程中的不同线程访问这个函数就会造成冲突。2、动态库导出了多个函数,而且多个函数间存在数据传递。一般DLL都导出多个函数,一个初始化,一个资源释放,其他为核心功能函数。这些函数间极有可能发生数据传递。如果一个初始化函数是在线程A中调用的,而核心功能函数是在线程B中调用的,那么线程A初始化函数的资源就无法对应线程B中的核心功能,此外还有核心功能函数间的数据传递,这样的DLL就不是线程安全的,必然导致错误。解决办法是由用户(即使用DLL的人)保证这些导出函数是在一个线程中调用。但这样会很大程度上限制接口的设计和用户的使用自由度。所以最好的方法是函数只管自己的线程安全,不同函数传递数据用动态TLS,线程局部存储。3、限制访问DLL中某一函数的线程数目。对于DLL中的某一个函数的访问线程数目是有限制的,超过了限制其他线程就得等一定的时间,一定的时间过后如果还不能得到执行机会,那就返回超时。这样的设计对用户来说是友好的,而且很实用,有的商业程序确实是按照允许用户访问的通道数目来计价的。对DLL中的函数做这样的一个封装,一般是简单的待用Semaphore信号量,来解决。DLL初始化时调用CreateSemaphore函数对信号量进行初始化,其原型如下:HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // pointer to security attributes LONG lInitialCount, // initial count LONG lMaximumCount, // maximum count LPCTSTR lpName // pointer to semaphore-object name ); 对于信号量,它每WaitForSingleObject一次(当然是要进入),其状态值(一个整数)就减1,使用完ReleaseSemaphore其状态值就加1,当其状态值为0时信号量就由有信号变为无信号。利用信号量的这一特性,我们在初始化时将信号量的初始值(第2个参数)设置为限制的线程访问数目。在要限制访问线程数目的函数内部,通过调用WaitForSingleOject获取控制权,并指定一个等待时间(这个由配置文件指定),根据情况超时返回,使用完ReleaseSemaphore释放对占用,让其他线程可以调用这个函数。4、多进程情况下的多线程安全DLL。LL是可以被多个进行加载并调用的。那就是说如果我们只对一个进程进行了限制,那么在多进程调用的情况下,这样的限制被轻易攻破。我们都知道,Semaphore信号量属于内核对象,也就是说其可以被多进程共享访问,也就说,如果我们给一个Semaphore指定了一个名字,在另一个进程中,我们只要调用OpenSemaphore函数用同一名字打开信号量就可以访问了。这样问题就解决了?现实情况是,多进程情况下,一般不是简单的多进程共享一个Semaphore就可以了。多进程间需要互通很多信息。一般的解决办法是,采用共享数据段。#pragma data_seg("share") int share_data;#pragma data_seg() #pragma comment(linker,"/SECTION:share, RWS")通过pragam编译器指令生成了一个名叫share的共享数据段,这样对于变量share_data就可以多进程共享的了。如果要多进程间交换数据,只要在data_seg中添加数据定义即可。

G. 多线程安全:确保线程安全的几种方法

线程安全问题主要是由于实例变量使用不当而引起的,这里以一个现实的例子来说明。Import javax.servlet. *;Import javax.servlet.http. *;Import java.io. *;Public class Concurrent Test extends HttpServlet {PrintWriter output;Public void service (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {String username;Response.setContentType ("text/html; charset=gb2312");Username = request.getParameter ("username");Output = response.getWriter ();Try {Thread. sleep (5000); //为了突出并发问题,在这设置一个延时} Catch (Interrupted Exception e){}output.println("用户名:"+Username+"<BR>");}}该Servlet中定义了一个实例变量output,在service方法将其赋值为用户的输出。当一个用户访问该Servlet时,程序会正常的运行,但当多个用户并发访问时,就可能会出现其它用户的信息显示在另外一些用户的浏览器上的问题。这是一个严重的问题。为了突出并发问题,便于测试、观察,我们在回显用户信息时执行了一个延时的操作。假设已在web.xml配置文件中注册了该Servlet,现有两个用户a和b同时访问该Servlet(可以启动两个IE浏览器,或者在两台机器上同时访问),即同时在浏览器中输入:a: http://localhost: 8080/servlet/ConcurrentTest? Username=ab: http://localhost: 8080/servlet/ConcurrentTest? Username=b如果用户b比用户a回车的时间稍慢一点,将得到如图2所示的输出:从图2中可以看到,Web服务器启动了两个线程分别处理来自用户a和用户b的请求,但是在用户a的浏览器上却得到一个空白的屏幕,用户a的信息显示在用户b的浏览器上。该Servlet存在线程不安全问题。下面我们就从分析该实例的内存模型入手,观察不同时刻实例变量output的值来分析使该Servlet线程不安全的原因。Java的内存模型JMM(Java Memory Model)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变量,线程之间无法相互直接访问堆栈中的变量。根据JMM,我们可以将论文中所讨论的Servlet实例的内存模型抽象为图3所示的模型。

H. Windows下的PHP安装文件线程安全和非线程安全的区别

Windows版的PHP从版本5.2.1开始有Thread Safe。这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用 多进程的工作方式不同的是Windows系统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程 的基础之上的,而非多线程。一般我们会把PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了。但存在一个问题,很多常用的 PHP扩展是以Linux/Unix的多进程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS。而用线程安全版本的话顶多只是搞跨某个 线程,而不会影响到整个IIS的安全。当然在IIS下CGI模式才是 PHP运行的最安全方式,但CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境,其消耗是巨大的。为了兼顾IIS下PHP的效率和安全, 有人给出了FastCGI的解决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个 进程同时执行。这样既解决了CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势。因此,如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。因此,如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。附:德问相关问题摘录下载PHP安装文件时,我看到有两种不同的二进制文件,像是非线程安全(Non Thread Safe)和线程安全(Thread Safe),比如该页面所列:http://windows.php.net/download/。这个是什么意思,之间有什么区别?这个主要是针对web server 而言,在windows环境下,如果你使用的web server 是apchae 或者 iis 7以下版本,则应该选择线程安全的安装文件,而如果你使用Fast-cgi模式时,可以选择非线程安全,因为 web sever 本身能保证线程安全。当然还有二进制文件编译时所使用的编译器:vc9 (vs系列) vc6(gcc)如楼上所言,是针对web server的,部分web server在处理应用请求的时候是用多线程而非多进程的方式处理,线程方式因为涉及到共享寄存器和内存,所以很容易出错,这个时候程序就需要花一些额外的经历去处理寄存器中的数据一致性,即保证线程安全。所以是否采用线程安全主要看你的web server所采用的PHP请求处理方式,如果是多线程处理,那么请选择线程安全的,否则选择非线程安全的,如楼上所说Fast-cgi方式可选择非线程安全的

I. java线程安全性问题

//下次发源代码时先整理好再发出来,累死了~呼呼packaget;importjava.io.File;importjava.io.IOException;importjava.util.Iterator;importjava.util.List;importjavax.servlet.ServletConfig;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***先帮你整理下,你这样估计没几人愿意看:**@authorHuangYong**/{//验证版本是否一致的java身份证=-5318854875823790516L;//上传的组件中要运用到的对象privateServletContextsc;//保存路径privateStringsavePath;publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doPost(request,response);}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//解决中文乱码问题,后面可以看看过滤器request.setCharacterEncoding("UTF-8");//设计模式中的工厂模式DiskFileItemFactoryfactory=newDiskFileItemFactory();//用来在Servlet中完成文件ServletFileUploapload=newServletFileUpload(factory);try{Listitems=upload.parseRequest(request);Iteratorit=items.iterator();while(it.hasNext()){//包括传过来的所有信息,包括文件和普通文本信息FileItemitem=(FileItem)it.next();//这个方法判断信息类型,普通文本为true文件为falseif(item.isFormField()){System.out.println("上传的表单项的名称:"+item.getFieldName());System.out.println("内容:"+item.getString("UTF-8"));}else{if(item.getName()!=null&&!item.getName().equals("")){System.out.println("上传文件的文件大小:"+item.getSize());System.out.println("上传文件的文件类型:"+item.getContentType());System.out.println("上传文件的文件名字:"+item.getName());Filetempfile=newFile(item.getName());//sc.getRealPath("/")代表获得当前应用的物理路径//,savePath为上传文件保存在服务器上的地址,自己在web.xml下设好的Filefile=newFile(sc.getRealPath("/")+savePath+tempfile.getName());//将上传的文件保存在服务器的物理磁盘目录下item.write(file);//在jsp页面上现实上传的结果}}}//解析文件}catch(Exceptione){thrownewRuntimeException(e);}}publicvoidinit(ServletConfigconfig)throwsServletException{//这是自己设的参数,用于保存上传文件应当保存的目录地址,在xml文件中初始化savePath=config.getInitParameter("savePath");sc=config.getServletContext();}}

首先, 成员变量用private修饰就是为了不让外部程序随意访问, 如果需要暴露给外部使用时, 通常需要getter访问器来控制权限, 框架程序除外;

关于成员变量引起的线程安全问题根据需求来控制, 如果没有必要时直接定义在方法体内就没有线程安全问题了, 象JDBC的对象(Connection, PreparedStatement, ResultSet..)直接在方法体内部定义;

sc 和 savePath 正常情况下没有线程安全问题, 不过你存储上传的文件时要小心同名文件问题

希望能帮助你


赞 (0)