2014-02-25 40 views
0

比方說有,在一個循環中運行4個消費者線程不斷用C在多線程程序中使用指針,局部變量++

function consumerLoop(threadIndex) 
{ 
    int myArray[100]; 

    main loop { 
    ..process data.. 
    myArray[myIndex] += newValue 
    } 
} 

我還有一個監視線程這確實其它後臺任務。 我需要從監視器線程訪問這些線程中的每個線程的myArray

假設循環將永遠運行(所以本地變量將存在),並且從監視器線程所需的唯一操作是讀取所有線程的數組內容。

一種替代方法是將myArray更改爲全局數組數組。但我猜測這會減緩消費者循環。

什麼是定義一個局部指針數組 int *p[4];和添加一行中consumerLoop像這樣p[threadIndex] = myArray和從監視線程訪問p分配每個元件到本地變量的地址的不良影響?

注:我在linux系統中運行它,語言是C++。當我從顯示器線程訪問數組內容時,我不關心數組內容的同步/有效性。讓我們遠離關於鎖定的討論

+1

爲什麼不爲主線程中的每個消費者線程分配MyArray,並將地址傳遞給消費者線程以及互斥量以避免同步問題? – Manex

+0

你沒有告訴我們你是什麼操作系統和什麼線程系統。並非所有線程模型都允許一個線程訪問另一個線程的局部變量。例如C11線程這個特性是實現定義的,它可能在那裏或者沒有。 –

回答

1

如果您對性能差異非常感興趣,則必須進行測量。我猜想,幾乎沒有區別。

這兩種方法都是正確的,只要監視器線程不訪問由於函數返回而無效的堆棧局部變量。

-2

您不能從不同的線程訪問myArray,因爲它是局部變量。 你可以做1)使用glibal變量或2)malloca並將地址傳遞給所有線程。 當所有線程急於使用公共內存時,請保護關鍵部分。

+0

即時通訊不直接訪問。我將地址存儲在全局指針中,然後訪問它。 – woodstok

+0

您正在使用全局變量,因此您必須使用互斥鎖或信號量來保護該變量免受線程的同時訪問。 – Amit

+0

我在問題中添加了額外的評論。我對同步觀點不感興趣。在編輯數值的同時,我可以讀取不正確的值 – woodstok