私は解決できない問題があります。 私はデータ構造をいくつかのスレッドで共有する必要があります。問題は次のとおりです。 スレッドは同時に実行され、特定の構造体にデータを挿入する必要がありますが、オブジェクトはすべてmutexの除外に挿入する必要があります。再挿入してはいけません。 私は、別のスレッドが現在のスレッドの終了を待つべき同じキーを置くことを望むなら、スレッドが彼らが働いているオブジェクトのキーを置く配列を作ることを考えています。 ので、他の言葉で、すべてのスレッドがロック要素のために、この機能を実行します。この方法でC - mutexデータ構造とマルチスレッド
void unlock_element(key_t key){
pthread_mutex_lock(&mtx_array);
while(array_busy==1){
pthread_cond_wait(&var_array,&mtx_array);
}
array_busy=1;
zeroed((int)key);
array_busy=0;
pthread_cond_signal(&var_array);
pthread_mutex_unlock(&mtx_array);
}
:私はフォロー機能をARRYでキーを解放するオブジェクトで終了した後
void lock_element(key_t key){
pthread_mutex_lock(&mtx_array);
while(array_busy==1){
pthread_cond_wait(&var_array,&mtx_array);
}
array_busy=1;
if((search_insert((int)key))==-1){
// the element is present in array and i can't insert,
// and i must wait for the array to be freed.
// (i think that the problem is here)
}
array_busy=0;
pthread_cond_signal(&var_array);
pthread_mutex_unlock(&mtx_array);
}
、結果はすべての実行で変更されます(たとえば、最初にプログラムが300オブジェクトを挿入し、2回目に100オブジェクトを挿入するなど)。
ありがとうございました!次のように私は、コードを修正
@DavidSchwartz @Asthor:UPDATE
void lock_element(key_t key){
pthread_mutex_lock(&mtx_array);
while((search_insert((int)key))==-1){
//wait
pthread_cond_wait(&var_array,&mtx_array);
}
pthread_mutex_unlock(&mtx_array);
}
と...を
void unlock_element(key_t key){
pthread_mutex_lock(&mtx_array);
zeroed((int)key);
pthread_cond_signal(&var_array);
pthread_mutex_unlock(&mtx_array);
}
しかし、動作しない...それは同じように動作します従来通り。
また、関数search_insert(key)の奇妙な動作に気付きました。
int search_insert(int key){
int k=0;
int found=0;
int fre=-1;
while(k<7 && found==0){
if(array[k]==key){
found=1;
} else if(array[k]==-1) fre=k;
k++;
}
if (found==1) {
return -1; //we can't put the key in the array
}else {
if(fre==-1) exit(EXIT_FAILURE);
array[fre]=key;
return 0;
}
}
は、オプションのカップルを持っている
if(found == 1)
mutexをすでに使用しているときに、なぜ 'array_busy'変数が必要でしょうか? – EOF
なぜこれが下降したのですか? – arunmoezhi
mutex(mtx_array)は変数array_busyをロックするためのものです。ロックされている場合にのみこの変数を使用できます。 – Flank