0

私はルーティング プロトコルを作成しています。スレッドを介して実装したネイバーごとに 30 秒のノンブロッキング タイマーが必要です。サンプル コードを次に示します。ただし、スレッドがタイムアウトしたか停止したかを区別するために、値が 2 または 0 であることを確認します (構造変数の値を設定してスレッドを停止しています)。

問題は、私の値がメイン関数に返されないことと、結合をブロックしていることがわかっている唯一の解決策ですが、ルーティングプロトコルには非ブロックが必要なことです。どんな助けでも大歓迎です。ありがとう。

struct arg_struct 
{
    int Wait_30sec;
    int Alarm_port[5];
    int index;
};

void* start_timer(void *arguments)
{
    struct arg_struct *args = (struct arg_struct *)arguments;
    int i;
    clock_t endwait;
    i = args->index;
    endwait = clock() + args->Wait_30sec * CLOCKS_PER_SEC;

    while (clock() < endwait && args->Alarm_port[i] == 0)
        ;

    if(args -> Alarm_port[i]==0) 
        args -> Alarm_port[i]=2;

    pthread_exit(NULL);
    return NULL;
}
4

1 に答える 1

0

あなたのコードによれば、そのアドレスをスレッドに渡したので、値はメインスレッドに反映されるはずです。次のようにコードをデバッグすることをお勧めします。

1) 最初にスレッドへの呼び出しを検査し、正しい構造体変数のアドレスを送信していることを確認します。次に、結果の正しい変数を検査するかどうかを確認します。

2)indexスレッドを呼び出す前に構造体の変数を設定しましたか?

3) 待っている最終値のバグが原因で、スレッドが終了しない可能性があります。現在の値と終了値を標準出力またはファイルに出力して、ループが終了するかどうかを確認してください。

于 2012-12-02T12:54:12.643 に答える