2017-05-29 5 views
0

pthread_createにchar *を含む構造体を渡し、メインとスレッドをmutexでロックするので、この文字列を保護することができるので、2番目のスレッドが作成されるときに文字列が変更され、スレッドは最初の文字列ではなく2番目の文字列を使用します。pthread_mutex_lockはスリープ時のみ有効

main.cの

while(th_num < th_size) 
{ 
    pthread_mutex_lock(&lock); 

    received = 0; 

    /* Read the desired readable size */ 
    if(read(newsock, &size, sizeof(size)) < 0) 
    { perror("Read"); exit(1); } 

    /* Read all data */ 
    while(received < size) 
    { 
     if((nread = read(newsock, buffer + received, size - received)) < 0) 
     { perror("Read"); exit(1); } 

     received += nread; 
    } 

    printf("Received string: %s\n",buffer); 


    Q->receiver = (char*) malloc(sizeof(char)*strlen(buffer)+1); 
    strncpy(Q->receiver, buffer, strlen(buffer)+1); 

    if((err = pthread_create(&thread_server[th_num], NULL, thread_start, (void*) Q)) == true) 
    { show_error("pthread_create", err); } 
    /* -------------------------------------------------- */ 


    th_num++; 

    pthread_mutex_unlock(&lock); 
    usleep(500); 
} 

pthread_server.c

pthread_mutex_lock(&lock); 
/* 
do some stuff here 
*/ 
pthread_mutex_unlock(&lock); 

プログラムが正常に動作しますが、問題は、私は(500)はusleep置く場合にのみ動作することである:ここではコードです。私の推測では、スレッドはミューテックスをロックすることができないので、これを行うにはスリープが必要です。 usleep()なしでそれを行う方法はありますか?あなたは、スレッドを使用

が、あなたのプログラムの流れが大きいための逐次ように近づいている:あなたはあなたの問題、コードの相互排他部分にpthread_create();を呼び出す必要があり、なぜ私は理解していないと仮定すると、

+1

スリープなしでは、mutexロック解除後の次の命令のほとんどが新しいmutexロックです。そのため、mutexはほとんど常にロックされています。 (ロックの解除とロックの間にループジャンプとテストがありますが、それだけです)それはいつも問題を引き起こすでしょう。ミューテックスは、他のスレッドがロックアウトされないように、最小限の時間保持する必要があります。あなたは、あなたがミューテックスを保持せずに有益な仕事をすることができるようにする必要があります。睡眠は、もちろん、他のスレッドに実行のチャンスを与えます。 –

+0

ここでポイントは、メインがミューテックスをロック解除するとスレッドがロックするので、メインが再びミューテックスをロックしようとすると、スレッドがロックを解除するまでスタックします。これは、最初のスレッドが終了する前にメインが文字列を変更しないようにするために役立ちます。ミューテックスが常にロックされているのはどうして悪いのか分かりません。 – P3ett

+0

スリープなしでは、スレッドがメインコード内のロック解除とロックの間でミューテックスをロックする機会をスレッドが偶然得ることはありません。彼らは文字通り「離れている」が、非常に近い順序で実行される。読み込みと割り当てのすべては時間がかかります。あなたはそのミューテックスであなたがしていることを再考する必要があります。あなたが何をやっているのかわからないコードが表示されています。これらの読み込みは、私たちが見る限り無期限にハングアップする可能性があります。メインプログラムが文字列を変更しないようにするには、文字列のコピーをスレッドに渡し、スレッドが解放します。 –

答えて

0

がありますコードの相互排除部分。

Xをプログラムの汎用スレッドとします。

usleep(500); Xスレッドが終了すると、pthread_mutex_unlock(&lock);でミューテックスが解放されますが、その後スレッドXはロックを再度取得して、相互排除部分のコードにアクセスすることはできません。

今、私はあなたの共有データがあるかわからないので、私はあなたが提案することができます:

1)を使用すると、共有データにアクセスするときにのみ、それを使用、コードの相互排除部分を削減。

2)プログラムの構造について再考してください。

関連する問題