簡體   English   中英

memcpy [或不?]和多線程[來自c ++ 11的std :: thread]

[英]memcpy [or not?] and multithreading [std::thread from c++11]

我用C / C ++編寫了一個軟件,使用了很多BIAS / Profil,一個區間代數庫。 在我的算法中,我有一個主機,它將一個域划分並將其中的一部分提供給從屬進程。 那些返回關於那些域部分的int法規。 有共同的閱讀數據,就是這樣。

我需要並行化我的代碼,但是只要有2個從屬線程正在運行(或者我猜更多)並且都是調用這個庫的函數,那就是段錯誤。 那些段錯誤的特殊之處在於gdb很少表示來自兩個構建的相同錯誤行:它取決於線程的速度,如果一個先前開始,等等。我已經嘗試讓線程產生直到從主人,它“穩定”錯誤。 我很確定它來自對庫的memcpy的調用(在gdb回溯之后,我總是在調用memcpy的BIAS / Profil函數上結束。公平地說,幾乎所有函數都將memcpy稱為臨時的返回結果之前的對象...)。 根據我在網上看到的內容,似乎memcpy()可能不是線程安全的,具體取決於實現(特別是這里 )。 (對於一個只能讀取共享數據的函數來說似乎很奇怪......或者也許在編寫線程數據時,兩個線程都會占用相同的內存空間?)

為了解決這個問題,我想'替換'(至少在測試行為改變的情況下)對memcpy進行互斥框架調用的調用。 (類似於mtx.lock(); mempcy(...); mtx.unlock();)

第一個問題:我根本不是開發/代碼工程師,缺乏很多基礎知識。 我認為,當我使用預先構建的BIAS / Profil庫時,調用的memcpy是構建庫的系統之一,對嗎? 如果是這樣,我會嘗試在我的系統上從源代碼構建庫嗎? (我不確定我可以建立這個庫,因此問題。)

第二個問題:在我的string.h中,memcpy由以下聲明: #ifndef __HAVE_ARCH_MEMCPY extern void * memcpy(void *,const void *,__kernel_size_t); #endif和其他一些字符串頭文件(string_64.h,string_32.h)中的形式定義: #define memcpy(dst, src, len) __inline_memcpy((dst), (src), (len)) __ inline_memcpy #define memcpy(dst, src, len) __inline_memcpy((dst), (src), (len))或更多明確定義,或僅僅是引用的聲明。 它開始變丑,但理想情況下,我想創建一個預處理器變量#define __HAVE_ARCH_MEMCPY 1 ,以及一個void * memcpy(void *,const void *,__kernel_size_t) ,它將使用mutex-framed memcpy被解雇的memcpy。 這里的想法是避免弄亂庫並使其與3行代碼一起工作;)

有什么好主意嗎? (這會讓我的一天......)

恕我直言,你不應該專注於memcpy()s,而是更高層次的funktionality。

如果並行運行的線程的處理內存間隔不重疊,則memcpy() 線程安全的。 實際上,在memcpy()中只有for(;;)循環(有很多優化)[至少在glibc中],它是原因,為什么它被聲明。

如果你想知道你的並行memcpy()線程會做什么,你應該想象for(;;)循環通過longint-pointers復制內存。

鑒於您的觀察結果以及Profil lib來自上一個千年,並且文檔(主頁和Profil2.ps )甚至不包含單詞“thread”,我認為lib不是線程安全的。

1st:不,通常memcpy是libc的一部分,它是動態鏈接的(至少現在如此)。 在linux上,請檢查ldd NAMEOFBINARY ,它應該提供類似libc.so.6 => /lib/i386-linux-gnu/libc.so.6或類似內容的行。 如果不是:重建。 如果是的話:重建無論如何都會有所幫助,因為還有很多其他因素。

除此之外,我認為memcpy是線程安全的,只要你永遠不會寫回數據(即使寫回未修改的數據也會受到影響: https//blogs.oracle.com/dave/entry/memcpy_concurrency_curiosities )。

第二:如果事實證明你必須使用修改后的memcpy ,那么也要考慮LD_PRELOAD

通常,必須使用臨界區互斥鎖或其他一些保護技術來防止多個線程同時訪問非線程安全(非重入)函數。 memcpy()一些ANSI C實現不是線程安全的,有些是。 安全不安全

編寫線程安全的函數和/或編寫可以安全地容納非線程安全函數的線程程序是一個重要的主題。 非常可行,但需要閱讀該主題。 寫得太多了。 ,至少可以幫助您開始提出正確的問題。

暫無
暫無

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

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