1

A、B、Cの3つのスレッドがあり、QNXリアルタイムオペレーティングシステムのC ++でシーケンスA、B、B、C、C、C、B、B、Aをスケジュールしたいと考えています。私のアプローチは、セマフォを使用して、最後に実行されたスレッドを保存することです(B->CおよびB->Aのため):

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
/*semaphores*/
sem_t sa = 1;
sem_t sb = 0;
sem_t sc = 0;

char last;         //remember the last processed thread


void* threadA (void* a) 
{
    while(1) 
    {
        sem_wait(&sa);          //p(sa)
        printf("threadA \n");   //threads function
        last = 'A';             //mark A as last processed
        sem_post(&sb);          //v(sb)
    }
}

void* threadB (void* a) 
{
    int c = 1;
    while(1) 
    {
        printf("threadB\n");
        if (c == 2)
        {
            sem_wait(&sb);
            c = 1;
            if (last == 'A')
            {
                last = 'B';
                sem_post(&sc);    
            }
            if (last == 'C')
            {
                last = 'B';
                sem_post(&sb)   
            }
        }
        c++;
    }
}

void* threadC (void* a) 
{
    int c = 1;
    while(1) 
    {
        printf("threadC \n");
        if (c == 3)
        {
            sem_wait(&sc);
            c = 1;
            last = 'C';
            sem_post(&sb);
        }
        c++;
    }
}

int main() 
{
    pthread_create (&threadA, NULL, threadA, NULL);
    pthread_create (&threadB, NULL, threadB, NULL);
    pthread_create (&threadC, NULL, threadC, NULL);
}

残念ながら、QNXがインストールされていないため、コードをテストできません。だから私の質問:これはうまくいくでしょうか、そしてこれを行うためのより良いまたは組み込まれた方法はありますか?

4

1 に答える 1

1

すぐに実行を開始したスレッドなどに依存していますか?これを行うには間違いなくより良い方法があります。

スレッドは、他のことを行う前にセマフォを待機する必要があります。

スケジューリングロジックを1つの共通の場所に移動します(スレッドタイプと反復回数を渡すと、シグナルが送信されます)。

sem_postシグナルに単一のループ反復要求があります。したがって、C3回実行する場合は、3回呼び出しますsem_post

の最初の引数であなたが何をしているのかわかりませんpthread_create。関数をスレッドデータで上書きしますか?悪いアイデア。

これはC++なので、スレッドの作成をオブジェクトにまとめます。そして、セマフォのようなものを渡して、void*引数で待機します。

タスクを成功させるには、マルチスレッドコードの作成経験が必要か、ライブプラットフォームでデバッグする機能が必要だと思います。

于 2013-01-04T15:44:58.753 に答える