Linux调度。 (并行线程)

时间:2016-01-24 18:18:26

标签: c linux 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);
}

我试图打印当前正在执行的线程以及&#34; Hello world!&#34;。但是,输出就是这个......

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

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

2 个答案:

答案 0 :(得分:1)

  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个线程。

答案 1 :(得分:0)

你忘了在大括号中加上一句话:

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);
}