2011-06-22 8 views
2

私はVoIPでプロジェクトを行っています。私はCコードでpthreadを持っています。私はpthreadsを開始し、それらの間にいくつかの睡眠を働かせる必要があります。今すぐスレッドが実行されています。サーバーからセッションが終了したら、実行中のスレッドを停止し、最初から新しいスレッドを再起動する必要があります。pthreads - スレッドの現在の実行を停止し、特定のイベント後に再起動します。

私のコードは次のようなものになります。

void *recv_thread(void *arg) 
{ 
/*receive the multimedia data and close the recv_thread when there is no more data to receive*/ 
} 


void *send_thread(void *arg) 
{ 
/*send the multimedia data*/ 
} 

send_recv_data() 
{ 

pthread_create(thread2, NULL, send_thread, NULL); 
pthread_create(thread3, NULL, recv_thread, NULL); 
} 

void *first_thread(void *arg) 
{ 
/*if some condition met the start the routine for creation of two threads one for receiving and one for sending data*/ 
if(cond == TRUE){ 
send_recv_data(); 
} 

} 
main() 
{ 
pthread_create(thread1, NULL, first_thread, NULL); 
} 

を私の質問は、私はそれは私にこれ以上データを送信していることを他のユーザーエージェントからのメッセージを受け取った後、私は、送信とrecvの両方を停止する必要があるということですそして最後に他の2つのスレッドの作成を担当するfirst_threadに渡されます。私はすべてのスレッドを停止すると、私は再びそれらを再起動する必要があります。私はmutexと条件変数を使ってみましたが、すべて無駄になりました。

私はこれを克服することができる方法の任意のアイデア、簡単なコードの小片が

おかげ

+0

この投稿の更新情報 – 125369

答えて

1

私は知っているより多くの知識がある人が指摘しているように、この種の振る舞いはすぐにの質問を提起するので、あなたは(あなたと思う)これらのスレッドを破壊/そのまま難読化として、なぜこれがある:

  • あなたは破壊する必要のための正当な理由を持っている/スレッド
  • を再作成するあなたは、スレッドの作成プロセスには、この多くの可能性が役に立たない層を追加するための正当な理由がある
  • メッセージを受け取るコード他のユーザーエージェントからの」スレッドIDへのアクセス権を持っている
  • あなたsendrecv機能が

低迷メカニズムのいくつかの並べ替えにアクセスすることができますこれは私がほぼ怖いな靴ホーンアプローチですそれにアプローチする。あなたのデザインの制約をもっと知らずに、の探索を始めることができます。

まず、彼らはそれがバイバイは行く時間だということを知らせることができるようにのはsendrecv機能を設定してみましょう:魔法を終了する必要があるとき

void* send_thread(void *arg) 
{ 
    pthread_mutex_lock(&wrapUpFlagMutex); 
    bool timeToQuit = wrapUpFlag; 
    pthread_mutex_unlock(&wrapUpFlagMutex); 

    while(timeToQuit == false) 
    { 
     ... 
     // You're doing something here 
     ... 
     pthread_mutex_lock(&wrapUpFlagMutex); 
     timeToQuit = wrapUpFlag; 
     pthread_mutex_unlock(&wrapUpFlagMutex); 
    } 

    // We've been flagged! Get out...the join will catch us. 
    pthread_exit(); 
} 

今すぐ何とか知っているコードを変更し、

dontShootTheMessenger() 
{ 
    ... 
    // We've just determined that those threads need to be restarted 

    // Flag those functions to wrap it up 
    pthread_mutex_lock(&wrapUpFlagMutex); 
    wrapUpFlag = true; 
    pthread_mutex_unlock(&wrapUpFlagMutex); 

    // Join the threads, note that this will block 
    pthread_join(thread3, NULL); 
    pthread_join(thread2, NULL); 
    pthread_join(thread1, NULL); 

    // Flag those functions to...not...wrap it up 
    pthread_mutex_lock(&wrapUpFlagMutex); 
    wrapUpFlag = false; 
    pthread_mutex_unlock(&wrapUpFlagMutex); 

    // Launch those puppies again 
    pthread_create(thread1, NULL, first_thread, NULL); 
    ... 
} 

これもやはりミミック主義のアプローチです。より堅牢なメソッドはおそらく条件変数、呼び出し構造の再設計、実際に渡された引数をスレッド関数に使用し、pthread_exit()などの戻り値を含むでしょう。

また、制約に応じて、pthread_killのような機能に興味があるかもしれません。どのような道を行くにしても、スレッドを殺す行為が何とかあなたのために物事をきれいにすることを望むだけで、あなたは自分自身を救うことはできません。

4

はるかに参考になるかもしれなぜあなたは起動してスレッドを停止する必要がありますか?通常は、スレッドを実行し続ける方が便利です。スレッドが役に立つ作業をしていないときに、何か(条件変数など)をブロックするようにしてください。

関連する問題