Как я могу форсировать определенную последовательность потоков в QNX?

У меня есть 3 потока: A, B и C, и я хочу запланировать последовательность A, B, B, C, C, C, B, B, A в C ++ в операционной системе реального времени QNX.
Мой подход заключается в использовании семафоров и сохранении последнего выполненного потока (потому что 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 threadvoid* 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. Итак, мой вопрос: будет ли это работать и есть ли лучший или встроенный способ сделать это?

1

Решение

Вы полагаетесь на потоки, запущенные сразу или что-то в этом роде? Есть определенно лучшие способы сделать это.

Ваши потоки должны ждать своего семафора, прежде чем делать что-либо еще.

Я бы переместил логику планирования в одну общую точку (возможно, передавал тип потока и количество итераций, и он отправлял сигналы).

Я бы имел каждый sem_post сигнализировать запрос итерации одного цикла. Так что если вы хотите C бегать 3 раза, звонить sem_post три раза.

Я понятия не имею, что вы делаете с первым аргументом pthread_create, Перезаписать функцию данными потока? Плохая идея.

Поскольку это C ++, я бы обернул создание потоков в объект. И я передал бы такие вещи, как семафор, чтобы ждать в void* Arg.

Я подозреваю, что вам нужно либо больше опыта написания многопоточного кода, либо возможность отладки на живой платформе, чтобы добиться успеха в вашей задаче.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]