這可能是一個愚蠢的問題,如果是這樣,我很抱歉。但是我正在努力利用計算機中的多個內核在我的四核 MacBook 中同時執行多個計算。這不是針對任何特定的專案,只是一個一般性的問題,因為我想學習什么時候我最終確實需要做這種事情
我知道執行緒,但似乎在同一個核心中運行,所以我似乎沒有獲得任何性能使用它們進行計算系結操作(它們對于基于套接字的東西非常有用!)。
我也知道可以使用 fork 創建的處理,但我不確定它們是否能保證使用更多的 CPU,或者它們是否像執行緒一樣,只是幫助處理 IO 系結操作。
最后,我知道 CUDA,允許 GPU 中的并行性(而且我認為 OpenCL 和 Compute Shaders 也允許我的代碼在 CPU 中并行運行)但我目前正在尋找可以讓我利用的東西我的電腦有多個 CPU 內核。
在 python 中,我知道 multiprocessing 模塊,它似乎提供了一個與執行緒非常相似的 API,但我似乎通過運行多個并行執行計算的函式來獲得優勢。我正在研究如何在 C 中獲得同樣的優勢,但我似乎無法
任何幫助我指向正確方向的幫助將不勝感激
注意:我正在嘗試實作真正的并行性,而不是并發性
注 2:我只知道執行緒和在 C 中使用多個行程,執行緒我似乎無法贏得我想要的性能提升。而且我對行程不是很熟悉,但我仍然不確定運行多個行程是否能保證給我我正在尋找的優勢。
uj5u.com熱心網友回復:
一個加熱 CPU 的簡單程式(所有可用內核的 100% 利用率)。
提示:執行緒啟動函式不回傳,程式退出[CTRL C]
#include <pthread.h>
void* func(void *arg)
{
while (1);
}
int main()
{
#define NUM_THREADS 4 //use the number of cores (if known)
pthread_t threads[NUM_THREADS];
for (int i=0; i < NUM_THREADS; i)
pthread_create(&threads[i], NULL, func, NULL);
for (int i=0; i < NUM_THREADS; i)
pthread_join(threads[i], NULL);
return 0;
}
匯編:
gcc -pthread -o thread_test thread_test.c
如果我開始./thread_test,所有核心都在 100%。
一句話fork和pthread_create:
fork創建一個新行程(當前行程映像將被復制并并行執行),同時pthread_create將創建一個新執行緒,有時稱為輕量級行程。
行程和執行緒都將與父行程“并行”運行。
這取決于何時在執行緒上使用子行程,例如,子行程能夠替換其行程映像(通過exec家族)并擁有自己的地址空間,而執行緒能夠共享當前父行程的地址空間。
當然還有很多不同之處,為此我建議研究以下頁面:
- 人叉
- 人執行緒
uj5u.com熱心網友回復:
C 中的并行性可以通過使用 fork() 函式來實作。該函式通過允許兩個執行緒同時運行并共享資料來模擬一個執行緒。第一個執行緒自己分叉,然后執行第二個執行緒,就好像它是從 main() 啟動的一樣。分叉允許多個行程同時運行而不會產生沖突。為了確保在兩個執行緒之間正確共享資料,請在訪問共享資源之前使用 wait() 函式。Wait 將阻止當前程式的執行,直到所有資料庫連接都關閉或所有 I/O 都已完成,以先到者為準。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520265.html
標籤:C并行处理多处理线程叉子
