[英]What is a basic example of "low-level" multi-threading in C++?
我是一個有幾年工作經驗的新手開發人員。 最近我在一家游戲公司面試,被問到“你做過多線程嗎?” 我告訴他們有一個帶有幾個線程的 C# 應用程序......然后我說了一些關於 Sql 中的事務和鎖定等。 面試官禮貌地告訴我,這太高級了,他們正在尋找有 C++ 多線程經驗的人。
那么什么是 C++ 中“低級”多線程的基本示例?
他可能指的是您對 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.