У меня есть 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. Итак, мой вопрос: будет ли это работать и есть ли лучший или встроенный способ сделать это?
Вы полагаетесь на потоки, запущенные сразу или что-то в этом роде? Есть определенно лучшие способы сделать это.
Ваши потоки должны ждать своего семафора, прежде чем делать что-либо еще.
Я бы переместил логику планирования в одну общую точку (возможно, передавал тип потока и количество итераций, и он отправлял сигналы).
Я бы имел каждый sem_post
сигнализировать запрос итерации одного цикла. Так что если вы хотите C
бегать 3 раза, звонить sem_post
три раза.
Я понятия не имею, что вы делаете с первым аргументом pthread_create
, Перезаписать функцию данными потока? Плохая идея.
Поскольку это C ++, я бы обернул создание потоков в объект. И я передал бы такие вещи, как семафор, чтобы ждать в void*
Arg.
Я подозреваю, что вам нужно либо больше опыта написания многопоточного кода, либо возможность отладки на живой платформе, чтобы добиться успеха в вашей задаче.
Других решений пока нет …