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);
}
我正在尝试使用线程,到目前为止,使用下面的代码,我做得很好。我还想打印执行线程的当前索引,但我遇到了一些问题。
#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);
}