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

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


person user1948715    schedule 04.01.2013    source источник
comment
Если вам нужна последовательная работа, используйте очередь задач и вообще не используйте потоки (или одного потребителя). Многопоточность значительно усложняет программу, и это хорошо, учитывая преимущество асинхронного выполнения. Теперь отнять это преимущество кажется немного бессмысленным. В таком случае лучше вообще не заморачиваться.   -  person Damon    schedule 04.01.2013
comment
Обратите внимание, что наличие нескольких четко определенных точек синхронизации между потоками может и, как правило, будет необходимо. Однако это совсем другое, чем то, о чем вы спрашиваете. Для этого можно использовать условные переменные, семафоры или барьеры (в зависимости от ситуации).   -  person Damon    schedule 04.01.2013


Ответы (1)


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

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

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

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

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

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

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

person Yakk - Adam Nevraumont    schedule 04.01.2013