printf
在Linux上是否使用线程安全写入stdout ?使用下级write
命令怎么办?
它不是C标准指定的-取决于您对C标准库的实现。实际上,C标准甚至根本没有提到线程,因为某些系统(例如嵌入式系统)没有多线程。
在GNU实现(glibc
)中,stdio中处理FILE*
对象的大多数高级函数都是线程安全的。通常没有unlocked
名字的(例如getc_unlocked(3)
)。但是,线程安全性处于每个函数调用级别:printf(3)
例如,如果您多次调用,则保证每个调用都是原子输出的,但是其他线程可能会在调用之间打印输出printf()
。如果要确保自动输出一系列I
/
O调用,则可以在它们周围加上一flockfile(3)/funlockfile(3)
对调用来锁定该FILE
句柄。请注意,这些函数是可重入的,因此您可以安全地printf()
在它们之间printf()
进行调用,即使以为本身对进行了调用,也不会导致死锁flockfile()
。
诸如此类的低级I / O调用write(2)
应该是线程安全的,但我对此不是100%肯定的- write()
使系统调用内核以执行I /
O。具体如何发生取决于您所使用的内核。它可能是该sysenter
指令,也可能是int
旧系统上的(中断)指令。一旦进入内核,就由内核来确定I /
O是线程安全的。在我刚刚对Darwin Kernel版本8.11.1进行的测试中,它write(2)
似乎是线程安全的。
问题内容: 如果您在同一文件描述符中的两个不同线程中调用(或,或两者兼有)会发生什么情况(让我们说我们对本地文件感兴趣,而这是套接字文件描述符),而没有显式使用同步机制? 读取和写入是系统调用,因此,在一个单核CPU上,不幸的是两次读取将“同时”执行。但是有多个核心… linux内核会做什么? 让我们更笼统一点:其他内核(例如BSD)的行为是否总是相同? 编辑:根据密切的文档,我们应该确保文件描述
问题内容: 为了使gettimeofday能够正常工作,当前时间必须全局存储,但是我不确定该函数是否修改了任何全局状态,从而并发执行未定义。 问题答案: gettimeofday是线程安全的。 这里列出的(posix)函数可能不是,gettimeofday不是其中之一。
问题内容: 如果我使用fopen()调用来在多线程中打开同一文件,然后将数据写入该文件。我是否应该使用互斥锁来确保数据不会混乱? 问题答案: 如果两个线程都使用来打开同一文件,则它们各自将具有独立的文件流(),并由引用同一文件的独立文件描述符支持。您可以独立地写入两个文件流,但是文件的最终结果将取决于线程在何处写入以及何时刷新文件流。除非您控制每个线程的写入位置,否则结果是不可预测的。最简单的事情
问题内容: 很快我将开始使用共享内存研究并行版本的网格细化算法。 该大学的一位教授指出,我们必须非常小心线程安全,因为编译器和stl都不知道线程。 我搜索了这个问题,答案取决于编译器(有些尝试是对线程 有所 了解的)和平台(如果编译器使用的系统调用是否是线程安全的)。 那么,在Linux中,gcc 4编译器会为新运算符生成线程安全代码吗? 如果不是,克服此 问题 的最佳方法是什么?也许将每个呼叫锁
本文向大家介绍C++ 线程安全信号,包括了C++ 线程安全信号的使用技巧和注意事项,需要的朋友参考一下 示例 C ++ 11 C ++ 11标准保证以同步方式初始化函数作用域对象的初始化。这可以用于通过延迟初始化实现线程安全的单例。
关于一次从多个线程访问局部变量的几个问题: > < li> 我有多个线程写入和读取变量值,我是否应该同步访问它? 变量每隔几秒钟从 Thread1 更新一次,每隔几秒钟从 Thread2 读取和更新到数据库。 如果我没有任何逻辑并且没有任何并发问题,会出现哪些问题? 我应该为此使用volatile吗? 编辑: 我想强调的是,我没有任何并发问题。这是我的具体方案: 一个。我的变量名称是 ,它测量 p