2011-05-15 9 views
0

これで、キュー内のpthreadに作業を動的に割り当てることに問題があります。キューを介してpthreadに作業を動的に割り当てる

例えば、私のコードで私は以下のような構造体を有する:

struct calc 
{ 
    double num; 
    double calcVal; 
}; 

Iは以下のように長さlのアレイ内の各構造体を格納します。

struct calc **calcArray; 

/* then I initialize the calcArray to say length l and 
    fill each calc struct with a num*/ 

ここで、numに基づいて、calcValの値を探したいと思います。それぞれのstruct calcはnumの値が異なります。

開始時に、

スレッド0がcalcArray [0]
スレッド1が2になるcalcArray [1]
スレッドを取得し、取得しますので、私は十分に簡単である4 pthreadsを産卵したいが、私はそれを作りたいですcalcArray [2]
スレッド3はスレッド1が終了モミあれば今、それはそれぞれのcalcの計算を行うには、スレッドごとに異なる時間がかかること

を想定しcalcArray [3]

を取得しますST、次に[5]

を行うことcalcArray [4]

次いで3終了するスレッドとcalcArrayを取得し得るであろうし、それがcalcArray [L]の終わりに達するまで続きます。

私は配列を1/4に分割することができます(各スレッドは計算の4分の1を取得します)。しかし、これをしたくありません。代わりに私は仕事を待ち行列のようにしたいと思う。これを行う方法に関するアイデア?

答えて

1

割り当てることのできる次の要素のインデックスを含む変数を作成し、それをミューテックスで保護することで、簡単に実現できます。

例:

// Index of next element to be worked on 
int next_pos; 

// Mutex that secures next_pos-access 
pthread_mutex_t next_pos_lock; 

int main() { 
    // ... 

    // Initialize the mutex before you create any threads 
    pthread_mutex_init(&next_pos_lock, NULL); 

    next_pos = NUM_THREADS; 

    // Create the threads 

    // ... 
} 

void *threadfunc(void *arg) { 
    int index = ...; 

    while (index < SIZE_OF_WORK_ARRAY) { 
     // Do your work 

     // Update your index 
     pthread_mutex_lock(&next_pos_lock); 
     index = next_pos; 
     next_pos++; 
     pthread_mutex_unlock(&next_pos_lock); 
    } 
} 

も参照してください:POSIX Threads Programming - Mutex Variables

+0

おかげで男を、私はそれを本当に感謝しています。 :D – user730882

+0

このコメントにはタイプミスがあります!それは "pthread"の代わりに "phread"と言います!私に長い時間をかけて発見しました。 –

+0

@ user309483:修正されました。 –

関連する問題