用C 11的多執行緒讀檔案

2021-09-11 20:28:55 字數 1547 閱讀 4764

曾經寫了一篇部落格做一些大資料的處理,但是其中在讀取乙個大檔案的時候,並沒有採取並行處理的方式。那麼,乙個大檔案,為了能夠批量處理,現在由多個執行緒來同時讀它,各自讀取一塊(所讀內容互不相同)。這麼做會有問題嗎?

答:如果只有讀執行緒,那麼沒有問題。因為,不同的執行緒可以建立自己的檔案描述符表項,再分別指向不同的檔案表項,而每個檔案表項裡面可以有不同的當前檔案偏移量,所以沒有問題。而且這種情況也根本不需要用到鎖。

以下是乙個實際的例子。

首先,假設當前目錄有乙個檔案1.txt(注意:必須是unix格式而非dos格式),其內容如下:

111111111

222222222

333333333

444444444

555555555

666666666

777777777

888888888

999999999

000000000

處理**如下:

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

void

thread_read_file

(int tid,

const string& file_path)

int pos;

if(tid ==

0) pos =0;

else pos = tid*

10;

file.

seekg

(pos, ios::beg)

; string line;

getline

(file, line)

; stringstream ss;

ss <<

"thread "

<< tid <<

", pos="

<< pos <<

": "

<< line <<

"\n"

; cout << ss.

str();

}void

test_detach

(const string& file_path)

}void

test_join

(const string& file_path)

auto it = vec_threads.

begin()

;for

(; it != vec_threads.

end();

++it)

}int

main()

以上**中,展示了執行緒的detach和join的2種寫法。對於本例來說,實際程式中,還是應該寫成join. 道理也很簡單。如果寫成了detach,一旦主線程先結束了,那麼還沒來得及列印的detach的子執行緒也就再也不會列印其資訊了。

(完)

C 11 多執行緒

新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...

c 11 多執行緒

1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...

C 11 多執行緒

2011 年 c 迎來重大的改革 語言層面上承認了 多執行緒 程式的存在 加入了 thread 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...