簡體   English   中英

C++ 中“低級”多線程的基本示例是什么?

[英]What is a basic example of "low-level" multi-threading in C++?

我是一個有幾年工作經驗的新手開發人員。 最近我在一家游戲公司面試,被問到“你做過多線程嗎?” 我告訴他們有一個帶有幾個線程的 C# 應用程序......然后我說了一些關於 Sql 中的事務和鎖定等。 面試官禮貌地告訴我,這太高級了,他們正在尋找有 C++ 多線程經驗的人。

那么什么是 C++ 中“低級”多線程的基本示例?

“低級線程”的規范實現是pthreads 通常與 pthread 一起教授的線程問題的最基本示例是某種形式的讀者和作者問題 該頁面還鏈接到更經典的線程問題,如生產者/消費者和用餐哲學家。

他可能指的是您對 C# 的使用,而不是您的線程經驗。

如果是游戲公司,那么他們可能想要這樣的答案:

“我實現了一個多線程 AI 例程,在可用 CPU 資源中為 NPC 分配決策樹計算。正確鎖定,尤其是在將代碼與應用程序的其余部分集成時,很困難。我們還花了一些時間跟蹤每個線程的資源使用情況因此,當 AI 處理威脅到主 UI 響應能力時,我們可以對其進行節流。”

(這些都是我編造的,我個人實際上並沒有做過。

這是一個使用 pthread 的快速示例,基於我們的一些測試代碼。 它產生兩個線程,並等待它們完成。

int main( void )
{
  pthread_t reader, writer;
  void *arg;

  // [... initialisation ...]

  // Spawn threads
  if( pthread_create( &reader, NULL, reader_func, arg ) ||
      pthread_create( &writer, NULL, writer_func, arg ) )
    {
      perror( "pthread_create" );
      return EX_OSERR;
    }

  // Wait while threads run
  pthread_join( reader, &arg );
  pthread_join( writer, &arg );

  return EX_OK;
}

void *reader_func( void *arg )
{
  // [... do some stuff ...]
  return NULL;
}

void *writer_func( void *arg )
{
  // [... do some different stuff ...]
  return NULL;
}

我會看一下http://zthread.sourceforge.net/ ,它是 PThreads 庫的優秀包裝器。 這是一個非常快速和穩定的庫,可以是相當低級的庫。 寫得很好,有據可查。

老實說,我認為你一直在做的事情和使用 pthreads 之間沒有太大區別。 如果您使用線程完成了大量工作,您就會遇到鎖定、同步等所有問題,並且可以很容易地直接使用 pthreads 調用。 您可能與此絕緣的稍微棘手的一件事是終止,從線程中獲取退出代碼等。

(當然,pthreads 並不像您所能獲得的那么低;如果您使用的是 linux,請查看 clone() 以了解它在系統調用級別上的實際工作方式。但除非他們真正使用它,否則沒有人真正使用它)重新實現 pthread。)

好吧,如果你真的想把這個想法發揮到“最大”,並且你願意用線程弄臟你的手。 我建議嘗試實現用戶空間線程庫。

查看 uconext.h 及其各種過程(setcontext、swapcontext 和 makecontext)並嘗試用它們編寫一個簡單的協作線程庫。 實現鎖、條件變量、線程創建/銷毀和協作讓步。 它不會特別花哨(即沒有實際的並行性(因為你需要深入研究克隆系統調用或內核)但如果你能做到,沒有人會說你沒有低水平經驗。

只是為了了解項目的規模。 我用大約 500 行 C++ 編寫了這樣一個簡單的線程庫,考慮到其中至少 20% 是注釋、斷言語句和用於調試的日志記錄。

此外, Boost Threads是圍繞 pthreads 和 Windows 線程的相當可移植的包裝器......據我所知,許多游戲開發商店使用 C++ 並且喜歡一些 Boost 庫。

暫無
暫無

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

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