2011-04-13 70 views
0

如何從線程外部修改線程數據?從線程外部修改線程數據

如果一個線程正在運行爲應用程序運行時循環的函數,它的數據如何設置,更改?

如何調用修改特定線程函數的函數?

這些功能屬於哪裏?

+0

你在用什麼語言? – Joe 2011-04-13 14:02:37

+0

C,使用POSIX線程 – jarryd 2011-04-13 14:02:56

回答

1

線程的優點和缺點是它們與進程中的每個其他線程共享內存空間。您可以使用您在單線程應用程序中使用的任何形式的數據傳輸,以在您的應用程序段之間傳遞數據。但是,在多線程應用程序中,您必須使用某種類型的同步來確保數據完整性並防止死鎖。

0

如果「線程的數據」你想從外到修改是與__thread擴展創建一個函數的局部變量在線程中運行,或者線程特定數據的形式,那麼只有即可方式從外部修改它們(UB中的模數代碼在技術上只是破壞內存)是通過讓線程獲取其變量的地址並將其存儲在其他線程可以看到它的地方(無論是在全局變量中,還是在通過線程啓動函數的參數void *

另請注意,正如重新指出的那樣,如果多個線程正在訪問相同的數據,則必須使用某種同步方法。只有標準/便攜式同步方法是pthread:pthread_mutex_lock等,但您也可以使用匯編或編譯器內在函數(如gcc中的__sync_*)。

+0

如果沒有其他線程或函數修改相同的數據會怎麼樣。我只是想修改一些在線程中運行的數據。只需修改例如一個在線程函數外部聲明的指針,並在線程之外修改它。線程將讀取指向數據並更新會很好? – jarryd 2011-04-13 15:01:28

+0

如果一個線程讀取另一個線程在沒有插入的pthread同步原語的情況下修改的內存,則每個POSIX的結果爲* undefined behavior *。實際上,它不會給你鼻子惡魔,但這意味着不能保證你的線程是否會「看到」另一個線程所做的改變。在x86和x86_64上,除非編譯器發現變量無法合法修改並優化重新加載,否則您將看到更改(「volatile」會修復此問題)。但在其他拱門上,可能需要特殊的記憶障礙。 – 2011-04-13 15:44:24