簡體   English   中英

g++ - 為什么在使用 std::thread 時必須傳遞“-pthread”選項?

[英]g++ - Why do I have to pass "-pthread" option while using std::thread?

我只是想理解 g++ 使用的概念。 這是我非常簡單的 std::thread 應用程序:

#include <iostream>
#include <thread>

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

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

我可以使用以下命令在 macOS/Xcode 9.0 設置上編譯它:

g++ main.cpp -std=c++11

但是我無法在 Linux 上使用相同的命令編譯它,據我所知,我也必須通過-pthread選項。 否則它會給我以下錯誤:

gcc 版本 7.1.1 20170622(紅帽 7.1.1-3)

main.o: In function `std::thread::thread<void (&)()>(void (&)())':
/usr/include/c++/5/thread:137: undefined reference to `pthread_create'

我認為這是不合邏輯的,我什至不應該知道它正在通過 pthread 實現 std::thread 類。 為什么我必須傳遞-pthread選項並鏈接到 pthread 庫? C++11 不應該將我從平台特定的細節中抽象出來嗎? 或者我是否有任何其他替代庫,例如 pthread 可以鏈接到我的 std::thread 使用? 還是我應該將其報告為錯誤?

謝謝。

根據GCC 的並發頁面,有必要根據所使用的功能為編譯器提供額外的選項。 您可以驗證您的 GCC 線程版本是否依賴於 POSIX 線程:

$ gcc -v 2>&1 | grep "Thread model"
Thread model: posix

有關行為的理由,請參閱此錯誤報告

問題是並非所有目標都需要 -pthread,或者某些確實需要它的拼寫方式不同,並且並非所有平台在使用該選項時都定義了 _REENTRANT,因此沒有可靠的方法來執行您的要求。

pthread是操作系統特定線程的行業標准,使用操作系統特定調用。

std::thread是 C++ 中的抽象,可以使用pthread或操作系統的本機線程來實現。 但是為了讓它在盡可能多的操作系統上運行得盡可能快, std-library實現者可以在posix實現它,因為它們應該適用於所有兼容的操作系統。

也有例外,一些 windows 只有std-library使用 windows 本機線程代替。

我正在將 pthread 移動到 C++11 中的 std:thread 並且遇到了與您遇到的相同的現象,並且我發現了這篇文章——這可能是正確的答案: https ://developers.redhat.com/articles /2021/12/17/why-glibc-234-removed-libpthread#

一個快速的結論:這取決於 glibc 的版本,2.34 之前版本的 glibc 將需要 -lpthead 標志,即使代碼沒有顯式使用 pthread。

要檢查 glibc 的版本,我們可以使用ldd --version命令,在我的 ubuntu 20.04 上,它返回如下: ldd (Ubuntu GLIBC 2.31-0ubuntu9.9) 2.31 ,所以我仍然必須添加 -lpthread 標志才能使用 std :線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM