Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正在将单个字符串写入cout“;线程安全“;在C++;98_C++_Multithreading_C++98 - Fatal编程技术网

C++ 正在将单个字符串写入cout“;线程安全“;在C++;98

C++ 正在将单个字符串写入cout“;线程安全“;在C++;98,c++,multithreading,c++98,C++,Multithreading,C++98,我知道严格地说,在C++98中没有什么是线程安全的,因为在标准中,C++11之前没有线程。但是,在实践中,线程在C++ 11之前已经被C++使用了很久。 假设两个pthread同时调用: void printSomething(){ std::cout << "something\n"; } void printSomething(){ 正如评论中指出的,C++98在标准中没有提供任何线程的概念,因此您不能通过参考标准来回答这个问题 然而,任何合理的C++98实现,如果打算

我知道严格地说,在C++98中没有什么是线程安全的,因为在标准中,C++11之前没有线程。但是,在实践中,线程在C++ 11之前已经被C++使用了很久。 假设两个
pthread
同时调用:

void printSomething(){
    std::cout << "something\n";
}
void printSomething(){

正如评论中指出的,C++98在标准中没有提供任何线程的概念,因此您不能通过参考标准来回答这个问题


然而,任何合理的C++98实现,如果打算与线程一起使用(即,它们中的大多数在某些嵌入式市场之外),几乎肯定至少会为“普通”提供或多或少安全的
std::cout
毕竟,将该流用于输出是非常常见的,在线程程序中跨线程使用它也是非常常见的

不幸的是,这是你能说的最具体的。请特别注意,我甚至没有用一种特定的方式定义“安全”。至少你可能期望它不会崩溃,不会损坏你的程序,也不会“凭空”产生输出。除此之外,这要视情况而定

这取决于什么 下一步是检查实现本身。希望您拥有source1

通常,您会发现实现有一些与线程无关的代码(例如,复制到堆栈本地缓冲区),并且在某些点锁定,然后在
std::cout
对象内操作共享状态。锁定的时间和位置很重要

单串
例如,我们希望两个线程上的单个项的输出,比如
std::cout,那么实际的问题是什么呢?C++98中的
std::cout
线程安全吗?不。当时编写它不是为了线程安全。C++98对线程一无所知。它不是“线程安全的”C++98没有线程的概念/概念。因此,无论你在这个世界上做什么(就线程而言),本质上都是“实现定义的”(或者更糟)。因此,你的问题的答案必须是“否”。明确地说:选择您要询问的实现。这超出了C++98本身的范围。@BaummitAugen您是对的,但实际上这只是一个一般性问题,没有考虑任何特定的用例。Tbh“它是实现定义的”对我来说已经是一个令人满意的答案。我知道没有保证,但我遗漏了正确的术语。你可以做的是放一个澄清器,比如“在典型的实现中,在C++98中编写单个字符串以确保线程安全”.当然,这只会导致语言律师告诉你,标准中没有典型的实现,等等,等等-但至少你可以从更实际、更不具法律倾向的海报中找到一些答案。稍微改变一下问题,让语言律师的论点不那么可疑。我k编辑并没有改变你的答案非常合适的事实。这比我希望的要多得多。顺便说一句:“毕竟,使用该流进行输出是非常常见的”,在线程化环境中,看到奇怪的消息被打乱是非常常见的(cout的典型用例用于跟踪/调试,因此没有人真正关心奇怪的混乱)@pm100-同意。我的经验是,
std::cout
通常提供大致“单字符串是原子保证”,但在同一行中插入的单独值通常是混合的。这实际上意味着
printf
提供了更好的体验,因为整行通常一次发送下来。我还经常看到
stdout
stderr
之间有很多交错,即使它们都在同一个地方:即使它们都是atomic、 终端实现经常喜欢不可预测地混合使用它们。@BeeOnRope:这不是终端的错-它对stdout和stderr一无所知。通常是标准库中的缓冲区导致了这种行为。@psmears-我不同意,但也许我应该说“shell”C++进程本身看到两个完全不同的文件,即代码> STDUD> <代码>和 STDRR :它们根本没有链接。C++库可能会对每个文件写入两个完全一致的流(实际上,可能只有两个线程:一个写入到代码> StdOuts< /Cord>),一个到“STDRR”。,但因为两者都将在同一个显示器上显示,所以它们是交错的。在这一点上,由shell将它们多路复用在一起,不是吗?
std::cout << "aaaaaaaaaa" << "bbbbbbbbbb";