3

C++ でテレメトリ システムをコーディングしていますが、特定のスレッドを標準の pthread_cond_timedwait および pthread_cond_broadcast と同期するのに苦労しています。

問題は、ブロードキャストを実行している関数が、別のスレッドがブロードキャストで動作しているかどうかを知るための何らかの方法が必要だったことです。

徹底的に調べた結果、代わりに 2 つのスレッドにバリアを使用してみることにしました。ただし、pthread_cond_timedwait のタイムアウト機能が必要でした。

これが基本的に私が思いついたものです:(しかし、それは過度に感じます)

Listen 関数:イベントが現在トリガーされているかどうかをミリ秒単位で確認します。

bool listen(uint8_t eventID, int timeout)
{  
    int waitCount = 0;  
    while(waitCount <= timeout)
    {  
        globalEventID = eventID;
        if(getUpdateFlag(eventID) == true)
        {
            pthread_barrier_wait(&barEvent);
            return true;
        }
        threadSleep(); //blocks for 1 millisecond
        ++waitCount;
    }
    return false;
}

トリガー機能:トリガー期間の更新フラグを設定することにより、ミリ秒単位でイベントをトリガーします

bool trigger(uint8_t eventID, int timeout)
    int waitCount = 0;  
    while(waitCount <= timeout)
    {  
        setUpdateFlag(eventID, true); //Sets the update flag to true
        if(globalEventID == eventID)
        {
            pthread_barrier_wait(&barEvent);
            return true;
        }
        threadSleep(); //blocks for 1 millisecond
        ++waitCount;
    }
    setUpdateFlag(eventID, false);
    return false;
}

私の質問: 放送局と情報を共有する別の方法はありますか、それとも障壁が本当に唯一の効率的な方法ですか? また、バリアを使用してタイムアウト機能を取得する別の方法はありますか?

4

1 に答える 1

2

説明した問題に基づく:

具体的には、待機中のメッセージがthread2によって解析されてグローバルリストに保存されたこと、およびthread1がリストからそのメッセージをコピーしてthread2ができるようになるため、thread2が解析と保存を続行できることをthread1に知らせようとしています。そのメッセージを新しいバージョンで上書きし、thread1の操作を中断しないようにします。

両方のスレッドを条件変数で交互に待機させることで、問題を解決できるようです。例えば。スレッド1:

pthread_mutex_lock(&mutex);
while (!message_present)
    pthread_cond_wait(&cond, &mutex);
copy_message();
message_present = 0;
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);

process_message();

スレッド2:

parse_message();

pthread_mutex_lock(&mutex);
while (message_present)
    pthread_cond_wait(&cond, &mutex);
store_message();
message_present = 1;
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
于 2012-08-01T10:59:30.767 に答える