运行 多线程循环调度

Running multiple thread with round-robin scheduling

我对多线程编程还很陌生。我想用 3 个不同的线程编写代码,每个线程打印一些不同的字符。线程的执行应该基于循环算法。假设我们有t1,t2,t3线程,它们的执行顺序应该是t1,t2,t3,t1,t2,t3,...

我为此编写了如下代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sched.h>

void* a(void* ptr) {
    for (int i=0; i< 10; i++){
        printf("1");
        printf("2");
        printf("3");
        printf("4");
    }
    return NULL;
}

void* b(void* ptr) {
    for (int i=0; i< 10; i++){
        printf("a");
        printf("b");
        printf("c");
        printf("d");
    }
    return NULL;
}

void* c(void* ptr) {
    for (int i=0; i< 10; i++){
        printf("5");
        printf("6");
        printf("7");
        printf("8");
    }
    return NULL;
}

int main() {
    pthread_attr_t attr1, attr2, attr3;
    
    pthread_attr_init(&attr1);
    pthread_attr_init(&attr2);
    pthread_attr_init(&attr3);
    
    pthread_t t1, t2, t3;
    
    pthread_attr_setschedpolicy(&attr1, SCHED_RR);
    pthread_create(&t1, &attr1, a, NULL);
    
    pthread_attr_setschedpolicy(&attr2, SCHED_RR);
    pthread_create(&t2, &attr2, b, NULL);
    
    pthread_attr_setschedpolicy(&attr3, SCHED_RR);
    pthread_create(&t3, &attr3, c, NULL);
    
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);
    
    pthread_exit(0);
    return 0;
}

输出为:

首先:输出不可重现,每次我 运行 二进制文件都会得到不同的输出。

12341234123412341234156785678567856785678567856785678567856782341234123412341234abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd.

我想要的输出是这样的:

123abc567...

大家知道我的代码有什么问题吗?

谢谢

How can I ensure that my threads are being executed in the Round-robin scheduling policy?

你快到了。您通过调用 pthread_attr_setschedpolicy(..., SCHED_RR); 来确保它,但是随后,您需要 检查 return 值 以查看它是否真的有效:

pthread_attr_t attr1;
int rVal = pthread_attr_setschedpolicy(&attr1, SCHED_RR);
if (rVal != 0) {
    // Failed to set the desired scheduler policy.
    perror("pthread_attr_setschedpolicy(&attr1, SCHED_RR)");
    exit(1);
}

rVal = pthread_create(&t1, &attr1, a, NULL);
if (rVal != 0) {
    // Failed to create a new thread.
    perror("pthread_create(&t1, &attr1, a, NULL)");
    exit(1);
}

What I want is...one iteration of 1234 followed by one iteration of abcd followed by one iteration of 5678 and repeat.

好吧,那是真正的问题。 “循环”并不意味着您似乎认为它意味着什么。事实上,您可以设置 no 调度程序策略,使您的程序产生该输出。如果您希望线程以这种方式相互协作,那么您需要编写明确的代码使它们相互 通信。您需要每个线程的 for 循环到;

  1. 等待 message/signal/event,意思是“轮到你了”,
  2. 打印它的东西,
  3. 发送一个message/signal/event到下一个线程,
  4. 返回步骤 1。

然后,在您的主线程创建了三个新线程中的每一个之后,它需要通过告诉任何一个新线程“轮到您了”来启动整个过程。

我会使用 semaphore 作为一个线程告诉另一个线程“轮到你了”的方式。每个线程我会有一个信号量,我会将指向 两个 信号量的指针传递给每个线程:线程等待轮到它的信号量,以及线程发出信号的信号量让下一个话题运行.

不幸的是,Posix 线程库 (pthreads) 不提供任何易于使用的信号量,并且 Unix semaphores 使用起来并不简单。

IMO,你应该做一点研究,如果你遇到任何你不明白的地方,然后回来提出一个新问题。