曾經寫了一篇部落格做一些大資料的處理,但是其中在讀取乙個大檔案的時候,並沒有採取並行處理的方式。那麼,乙個大檔案,為了能夠批量處理,現在由多個執行緒來同時讀它,各自讀取一塊(所讀內容互不相同)。這麼做會有問題嗎?
答:如果只有讀執行緒,那麼沒有問題。因為,不同的執行緒可以建立自己的檔案描述符表項,再分別指向不同的檔案表項,而每個檔案表項裡面可以有不同的當前檔案偏移量,所以沒有問題。而且這種情況也根本不需要用到鎖。
以下是乙個實際的例子。
首先,假設當前目錄有乙個檔案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 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...