pthread_yield не выполняет циклический переход между потоками - PullRequest
1 голос
/ 19 сентября 2019

У меня есть три функции A, B, C, которые я хочу использовать для работы с потоками.Я хочу запустить их для определенного количества итераций и хочет переключаться между ними на каждой итерации.У меня проблемы с порядком их выполнения при использовании pthread_yield ()

Ниже приведен код для этих функций

void *A(void *arg){
int i = 0;
for (i=0; i < 3; i++){
    printf("Hello A%d\n", i);
    pthread_yield();
    }
}

void *B(void *arg){
    int i = 0;
    for(i=0; i < 3; i++){
        printf("Hello B%d\n", i);
        pthread_yield();
    }
}

void *C(void *arg){
    int i = 0;
    for(i=0; i < 3; i++){
        printf("Hello C%d\n", i);
        pthread_yield();
    }
}

, а вот код для моей основной функции, где я делаю потоки

int main(){

    pthread_t threadId_1, threadId_2, threadId_3;

    printf("Before Thread\n"); 
    pthread_create(&threadId_1, NULL, A, NULL); 
    pthread_create(&threadId_2, NULL, B, NULL); 
    pthread_create(&threadId_3, NULL, C, NULL); 
    // This line is Equivalent to Sleep // pthread_join(threadId_1, NULL); 
    //pthread_join(threadId_2, NULL);
    //pthread_join(threadId_3, NULL);
    sleep(1);
    printf("After Thread\n");

}

когда я запускаю программу, я получаю следующий вывод:

Before Thread
Hello C0
Hello B0
Hello C1
Hello B1
Hello C2
Hello B2
Hello A0
Hello A1
Hello A2
After Thread

Вместо этого я хочу

Before Thread
Hello A0
Hello B0
Hello C0
Hello A1
Hello B1
Hello C1
Hello A2
Hello B2
Hello C2
After Thread

Если я не использую pthread_yieldпоток, который я создал последним, закончится первым, а затем последним последним, а поток, созданный первым, закончится последнимпочему это так?

Кроме того, когда я использую pthread_yield, почему программа чередуется между двумя последними созданными потоками B и C, прежде чем завершить выполнение и затем перейти к потоку A?

Как мне добиться желаемого результата, когда нити A, B, C прекрасно чередуются между собой?

1 Ответ

2 голосов
/ 19 сентября 2019

man pthread_yield:

заставляет вызывающий поток освободить ЦП.Поток помещается в конец очереди выполнения для его статического приоритета, и запланирован запуск другого потока. Если вызывающий поток является единственным потоком в списке наивысшего приоритета в то время, он продолжит работу.

Другими словами, pthread_yield не гарантирует приостановкунить.И, следовательно, это не может помочь упорядочить или сериализовать выполнение потоков.Это неправильный инструмент для вашей задачи.


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

Одно из решений состоит в том, чтобы один поток выполнял функции A, B и C в последовательном порядке один за другим.

Другое решение может состоять в том, чтобы привязать потоки к одному и тому же ЦП и назначить реальныйприоритет времени FIFO, так что pthread_yield переключается на другой поток FIFO реального времени, ожидающий запуска на том же процессоре.Однако в этом случае параллелизм теряется, что в первую очередь сводит на нет необходимость иметь несколько потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...