私はプログラムを書いたと書いたが、私はそれが期待どおりに動作しません。 私は2つのスレッド:thread
トリガーfunc
とanotherThread
トリガーanotherFunc
を持っています。私がしたいのは、が10
のfunc
に達し、anotherThread
がpthread_cond_wait
とpthread_cond_signal
を使ってトリガされたときです。 sleep(1)
行のコメントを外すと、奇妙なことはすべてうまくいきます。私はスレッドに新しく、私はチュートリアルhereに従っていましたが、もし私がsleep
の行をコメントに書いていれば、それも壊れてしまいます。POSIX Cスレッド。 pthread_cond_tの例です。予期したとおりに動作しません
私の質問は、どのようにsleep()
コールなしでこの仕事をすることができますか?私のコードでfunc
がに達した場合はどうなりますか?anotherFunc
の後にはどうなりますか?どうすればこれらのことをコントロールできますか?これは私のコードです:長い記事のため
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t myMutex;
pthread_cond_t cond;
pthread_attr_t attr;
int cont;
void *func(void*)
{
printf("func\n");
for(int i = 0; i < 20; i++)
{
pthread_mutex_lock(&myMutex);
cont++;
printf("%d\n", cont);
if(cont == 10)
{
printf("signal:\n");
pthread_cond_signal(&cond);
// sleep(1);
}
pthread_mutex_unlock(&myMutex);
}
printf("Done func\n");
pthread_exit(NULL);
}
void *anotherFunc(void*)
{
printf("anotherFunc\n");
pthread_mutex_lock(&myMutex);
printf("waiting...\n");
pthread_cond_wait(&cond, &myMutex);
cont += 10;
printf("slot\n");
pthread_mutex_unlock(&myMutex);
printf("mutex unlocked anotherFunc\n");
printf("Done anotherFunc\n");
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t thread;
pthread_t anotherThread;
pthread_attr_init(&attr);
pthread_mutex_init(&myMutex, NULL);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_cond_init(&cond, NULL);
pthread_create(&anotherThread, &attr, anotherFunc, NULL);
pthread_create(&thread, &attr, func, NULL);
pthread_join(thread, NULL);
pthread_join(anotherThread, NULL);
printf("Done MAIN()");
pthread_mutex_destroy(&myMutex);
pthread_cond_destroy(&cond);
pthread_attr_destroy(&attr);
pthread_exit(NULL);
return 0;
}
申し訳ありませんが、私はスレッドに新たなんだと私は学ぶために喜びました。また、Linux上のスレッドやネットワークに関するいくつかの良いリファレンスやコース/チュートリアルを知っていますか?私はチャットクライアントを作成することを学びたいと思うし、スレッドとネットワークを知る必要があると聞いた。問題は、私が知る必要があることが分からないので、私が学んだことが大丈夫だと、私はかなりよく分からない。
はそんなにありがとう:)
その他の備考。私は 'pthread_attr_t'を使う必要がないことに加えて、コードを単純化するために条件とmutexに静的初期化子を使うことができます。さらに、あなたのスレッド関数は単に 'pthread_exit'を呼び出すのではなく' NULLを返します 'または' return 0; 'だけで済みます。そしてあなたのメインスレッドは、 'pthread_exit'を呼び出さずにmainから' return 0; 'だけすることができます。他のスレッドは、結合されてからその時点で実行されていません。 mainからの復帰はプロセスの終了を強制するが、プライマリスレッドの 'pthread_exit'はプロセス終了を強制しない。これは他のスレッドを実行させ続けるのに便利である。 – Kaz
また、静的なミューテックスや条件をクリーンアップする必要はありません。 'pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;'を使うだけです。複雑な初期化は、通常とは異なる属性を設定する場合に必要です。例えば。プロセス共有の強力なミューテックスを作る。実行はpthread_cond_waitのに到達したとき、信号が受信されるまでスレッドがフリーズ: – Kaz