Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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++ g++;-为什么我必须通过考试-pthread";使用std::thread时的选项?_C++_Multithreading_C++11_G++_Pthreads - Fatal编程技术网

C++ g++;-为什么我必须通过考试-pthread";使用std::thread时的选项?

C++ g++;-为什么我必须通过考试-pthread";使用std::thread时的选项?,c++,multithreading,c++11,g++,pthreads,C++,Multithreading,C++11,G++,Pthreads,我只是想理解g++使用的一个概念。下面是我非常简单的std::thread应用程序: #include <iostream> #include <thread> void func() { std::cout << "Running..." << std::endl; } int main() { std::thread t(func); t.join(); return 0; } 我认为这是不合逻辑的,我甚

我只是想理解g++使用的一个概念。下面是我非常简单的std::thread应用程序:

#include <iostream>
#include <thread>

void func() {
    std::cout << "Running..." <<  std::endl;
}

int main()
{
    std::thread t(func);
    t.join();
    return 0;
}

我认为这是不合逻辑的,我甚至不应该知道它是通过pthread实现std::thread类的。为什么我必须传递
-pthread
选项并链接pthread库?难道C++11不应该把我从特定于平台的细节中抽象出来吗?或者我是否有任何其他替代库,比如pthread,我可以针对std::thread使用进行链接?或者我应该将其报告为bug


谢谢。

pthread
是针对特定于操作系统的线程的行业标准,使用特定于操作系统的调用

<>代码> STD::线程是C++中的一个抽象,可以使用<代码> pTox<代码>或OS的本地线程实现。但是为了使它能在尽可能多的操作系统上快速工作,
std库
实现者可以在
posix
中实现它,因为它们应该可以在所有兼容的操作系统上运行

也有例外,一些仅windows
std库
使用windows本机线程。

根据,有必要根据所使用的功能为编译器提供其他选项。您可以验证您的GCC线程版本是否依赖于POSIX线程:

$ gcc -v 2>&1 | grep "Thread model"
Thread model: posix
有关行为的理由,请参见:

问题是,并非所有目标都需要-pthread,或者某些确实需要它的目标拼写不同,并且在使用该选项时,并非所有平台都定义了可重入,因此没有可靠的方法来实现您的要求


使用现代版本的GCC,您不需要这样做-您的GCC版本是什么?c++11或任何其他版本都没有指定如何与compler/tools交互。您必须接受的是,在某些平台上,当您需要某些功能时,您需要使用某些标志来调用编译器。@NeilButterworth gcc版本7.1.1 20170622(Red Hat 7.1.1-3)“C++11不应该将我从特定于平台的细节中抽象出来吗”C++11将代码从特定于平台的细节中抽象出来,这意味着,如果您遵循这些规则,那么您的源代码将很难用任何其他符合要求的编译器进行编译;生成系统仍然像往常一样丑陋。@MatteoItalia编译器应该负责传播其自身实现细节的库依赖项。我在RHEL7的GCC 8.3上遇到了同样的问题:现在我必须猜测编译器的实现并相应地链接其他库。这并不能真正回答IMHO的问题。标准库不应该要求您指定任何其他要链接的库。这很好,但是为什么用户在仅使用标准库构造时必须显式链接任何库?GCC的链接器的任务是整理链接所针对的内容,这样标准库中的所有内容都可以使用。@einpoklum但链接器不知道您在使用std,您的程序可能是某个正在链接的fortran程序,或者它可能已经包含在其中一个库中,包括您额外的工作,以了解内容。或者您可能希望使用另一个线程库来链接。如果链接器能读懂我的想法,然后链接我的想法,那就太好了,但我们还得再等一会儿,但我的程序不是来自Fortran。我使用g++进行编译和链接。至少在这种情况下,它应该确保链接器引用了适当的库。
$ gcc -v 2>&1 | grep "Thread model"
Thread model: posix