2

mutex /condwaitクラスのこの単純なラッパーに問題があります。接続されたクライアントのキューを保護し、待機状態のスレッドに新しいクライアントが接続されていることを通知するために使用しますが、アプリケーションがクラッシュし、セグメンテーションが失敗しました。

client_socket_fd = clients_for_threads_q.front();

ストレステスト中のみ(多くのクライアントが接続されている場合)

スレッドで待ちます:

    MUTEXCONDSIGNAL_for_workers.lock();
    if ( clients_for_threads_q.empty() )
    {
        MUTEXCONDSIGNAL_for_workers.wait_signal();
    }

    client_socket_fd = clients_for_threads_q.front(); // CRASHED !!!!
    clients_for_threads_q.pop();
    MUTEXCONDSIGNAL_for_workers.unlock();

もちろん、clients_for_threads_qは書き込みに影響を受けます

    MUTEXCONDSIGNAL_for_workers.lock();
    clients_for_threads_q.push (client_socket_fd);
    MUTEXCONDSIGNAL_for_workers.send_signal();
    MUTEXCONDSIGNAL_for_workers.unlock();
4

1 に答える 1

4

pthread_cond_wait偽のウェイクアップが発生する可能性があります。

条件変数を使用する場合、スレッドが続行する必要がある場合にtrueとなる、各条件待機に関連付けられた共有変数を含むブール述語が常に存在します。pthread_cond_wait()またはpthread_cond_timedwait()関数からの誤ったウェイクアップが発生する可能性があります。pthread_cond_wait()またはpthread_cond_timedwait()からの戻りは、この述語の値について何も意味しないため、そのような戻り時に述語を再評価する必要があります。

ifウェイターの条件をループに変更する必要があります。

while ( clients_for_threads_q.empty() )
{
    MUTEXCONDSIGNAL_for_workers.wait_signal();
}
于 2012-04-21T23:19:30.807 に答える