1

プリエンプティブ スレッド スケジューリング環境で並列プログラムを作成したいのですが、ミューテックス (常に取られないように初期化されるバイナリ ミューテックス)、待機命令、およびスレッド協調命令 (スレッド内の別のタスクへの譲歩) を使用して同期することができます。しかし、利用可能なセマフォ メカニズムはありません (実際、私はLego Mindstorm 用のNXCプログラミング言語でプログラムを書いています)。

2 つのスレッドABでプログラムを作成し、(ABABAB ...) のような実行順序を生成する方法はありますか? [2 つの関数 A() と B() を呼び出すループを含む 1 つのスレッドを持つようなものですが、ここではマルチスレッド方式です]

セマフォがあれば、次のようにすると思います。

semaphore SemA = 1, SemB=0;
//in A
{
    while(true)
    {
    down(SemA);
    //Do the things
    up(SemB);
    }
 }
//in B
{
    while(true)
    {
    down(SemB);
    //Do the things
    up(SemA);
    }
 }
4

1 に答える 1

0

それが機能するかどうかはわかりませんが、単一のミューテックスとYield関数で試すことができます。AとBが2つだけのタスクである場合、意図したとおりに常に一方から他方に切り替わると思いますが、NXTがないため、テストできません。

mutex sync;
//in A
{
    while(true)
    {
        Acquire(sync);
        //Do the things
        Release(sync);
        Yield();
    }
}
//in B
{
    while(true)
    {
        Acquire(sync);
        //Do the things
        Release(sync);
        Yield();
    }
}
于 2012-10-17T21:08:21.117 に答える