Linux 调度。 (线程)

Linux scheduling. (pthreads)

我正在尝试使用线程,到目前为止,使用下面的代码,我做得很好。我还想打印执行线程的当前索引,但我遇到了一些问题。

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5

void *runner(void *param);

int main(int argc, char *argv[])
{
    int i, policy;
    pthread_t tid[NUM_THREADS];
    pthread_attr_t attr;

    pthread_attr_init(&attr);

    if(pthread_attr_getschedpolicy(&attr, &policy) != 0)
        fprintf(stderr, "Unable to get policy.\n");
    else{
        if(policy == SCHED_OTHER)
            printf("SCHED_OTHER\n");
        else if(policy == SCHED_RR)
            printf("SCHED_RR\n");
        else if(policy == SCHED_FIFO)
            printf("SCHED_FIFO\n");
    }

    if(pthread_attr_setschedpolicy(&attr, SCHED_FIFO) != 0)
        fprintf(stderr, "Unable to set policy.\n");
    /* create the threads */
    for(i = 0; i < NUM_THREADS; i++)
        printf("Hi, I'm thread #%d\n", i);
        pthread_create(&tid[i], &attr, runner, NULL);
    /* now join on each thread */
    for(i = 0; i < NUM_THREADS; i++)
        pthread_join(tid[i], NULL);
}

/* Each thread will begin control in this function */
void *runner(void *param)
{
     /* do some work... */
     printf("Hello world!");
     pthread_exit(0);
}

我正在尝试打印当前正在执行的线程以及 "Hello world!"。但是,输出是这样的...

SCHED_OTHER
Hello, I'm thread #0
Hello, I'm thread #1
Hello, I'm thread #2
Hello, I'm thread #3
Hello, I'm thread #4
Segmentation fault (core dumped)

到目前为止,我已经尝试发出

ulimit -c unlimited

我可以在代码中调整什么来实现我的目标?

这个

  for(i = 0; i < NUM_THREADS; i++)
        printf("Hi, I'm thread #%d\n", i);
        pthread_create(&tid[i], &attr, runner, NULL);

应该是

  for(i = 0; i < NUM_THREADS; i++) {
        printf("Hi, I'm thread #%d\n", i);
        pthread_create(&tid[i], &attr, runner, NULL);
   }

在您的代码中,您只是创建了一个线程并试图加入 5 个线程。

您忘记将语句块放在大括号中:

for(i = 0; i < NUM_THREADS; i++)
    printf("Hi, I'm thread #%d\n", i);
    pthread_create(&tid[i], &attr, runner, NULL);

要在 for 循环中执行的多个语句必须用大括号括起来,否则只会调用其中的第一个,在本例中为 printf("Hi, I'm thread #%d\n", i)。解决方案:

for(i = 0; i < NUM_THREADS; i++)
{
    printf("Hi, I'm thread #%d\n", i);
    pthread_create(&tid[i], &attr, runner, NULL);
}