0
gcc (GCC) 4.6.3
c89

こんにちは、

これがメインによって作成されたワーカー/バックグラウンド スレッドを処理する最良の方法であるかどうか疑問に思っていますか?

私はこれを正しくやっていますか?マルチスレッドプログラムを実行したのはこれが初めてです。スレッドを追加するにはこれを拡張する必要があるため、正しい軌道に乗っていることを確認したいだけです。

メッセージを送信するためのスレッドと、メッセージを受信するためのスレッドがあります。

ご提案いただきありがとうございます。

int main(void)
{
    pthread_t thread_send;
    pthread_t thread_recv;

    int status = TRUE;

    /* Start thread that will send a message */
    if(pthread_create(&thread_send, NULL, thread_send_fd, NULL) == -1) {
        fprintf(stderr, "Failed to create thread, reason [ %s ]",
                strerror(errno));
        status = FALSE;
    }

    if(status != FALSE) {
        /* Thread send started ok - join with the main thread when its work is done */
        pthread_join(thread_send, NULL);

        /* Start thread to receive messages */
        if(pthread_create(&thread_recv, NULL, thread_receive_fd, NULL) == -1) {
            fprintf(stderr, "Failed to create thread for receiving, reason [ %s ]",
                    strerror(errno));
            status = FALSE;

            /* Cancel the thread send if it is still running as the thread receive failed to start */
            if(pthread_cancel(thread_send) != 0) {
                fprintf(stderr, "Failed to cancel thread for sending, reason [ %s ]",
                        strerror(errno));
            }
        }
    }

    if(status != FALSE) {
        /* Thread receive started ok - join with the main thread when its work is done */
        pthread_join(thread_recv, NULL);
    }

    return 0;
}

メッセージを送信するワーカー/バックグラウンド スレッドの例 (例のみ)

void *thread_send_fd()
{
    /* Send the messages when done exit */

    pthread_exit(NULL);
}
4

2 に答える 2

2

この種の構成が正当化されるのは、交換されるメッセージが 1 つだけで、その場合でも問題が発生する場合のみです。

アプリの実行中にメッセージが継続的に交換される場合は、両方のスレッドをループとして記述し、決して終了しない方が一般的です。これは、継続的な作成/終了/破棄のオーバーヘッドがなく、デッドロック ジェネレータ (別名結合) がないことを意味します。これにはマイナス面があります。つまり、スレッド間通信のためにシグナルやキューなどに関与する必要がありますが、これは、多くのマルチスレッド アプリを作成する場合に発生します。

いずれにせよ、最初に rx スレッドを開始するのが通常です。最初に tx スレッドを開始すると、rx スレッドが開始する前に rx データが返されて破棄される可能性があります。

于 2012-04-06T17:53:45.307 に答える
1

これはメッセージごとに 1 回行われますか? 呼び出しにより、1 つのメッセージを送信するスレッドと、1 つの応答を待機する別のスレッドが作成されるようです。次に、呼び出し、そしてプログラム全体を想定していますが、すべてが完了するのを待つだけです。送信者が送信を完了するまで受信者が何もできないと仮定すると、これはプログラムの実際のパフォーマンスまたは認識されたパフォーマンスを改善するためにまったく何もしません。正確に言うと、送信側と受信側が実際に何をしているのかを知る必要があります。なんらかの利点を得るには、送信側スレッドと受信側スレッドは、同時に実行できる作業を行う必要があります....シリアルではありません。プログラムが送信トランザクションと受信トランザクションを待機しないようにすることが意図されている場合、これはまったく待機しません。

于 2012-04-07T23:06:46.610 に答える