我试着通过例子来理解pthread。我编写了以下代码,每次运行时都会给出不同的答案!有人能解释一下这个bug吗?提亚,斯维娅
代码如下:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 4
struct thread_data {
int thread_id;
int sum;
};
struct thread_data thread_data_array[NUM_THREADS];
void *PrintHello(void *threadarg)
{
struct thread_data *my_data;
int taskid;
int sum;
my_data = (struct thread_data *) threadarg;
taskid = my_data->thread_id;
sum = my_data->sum;
printf("Hello World! It's me, thread #%d\n", taskid);
return my_data;
}
int main ()
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
int sum=0;
for (t=0; t < NUM_THREADS; t++) {
printf("Hi! %ld\n", t);
threads[t] = t;
thread_data_array[t].thread_id = t;
thread_data_array[t].sum = sum;
rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &thread_data_array[t]);
}
return 0;
}输出如下:
[user@office tmp]$ ./a.out
Hi! 0
Hi! 1
Hello World! It's me, thread #0
Hello World! It's me, thread #1
Hi! 2
Hi! 3
Hello World! It's me, thread #2
[user@office tmp]$ ./a.out
Hi! 0
Hi! 1
Hello World! It's me, thread #0
Hello World! It's me, thread #1
Hi! 2
Hi! 3
Hello World! It's me, thread #2
Hello World! It's me, thread #3
[user@office tmp]$ ./a.out
Hi! 0
Hello World! It's me, thread #0
Hi! 1
Hello World! It's me, thread #1
Hi! 2
Hello World! It's me, thread #2
Hi! 3
Hello World! It's me, thread #3
[user@office tmp]$ ./a.out
Hi! 0
Hi! 1
Hello World! It's me, thread #0
Hi! 2
Hi! 3
Hello World! It's me, thread #3
[user@office tmp]$ 发布于 2009-11-05 20:31:41
没有bug,这只是线程的工作方式。你的主线程会创建新的线程,这些线程在这一点上是“可以运行的”。在某个时间点(由操作系统决定),您的主线程将被挂起,而另一个线程将运行一定的时间(通常为几十毫秒)。当你的程序存在正在运行的线程时,系统会一直在线程之间切换。
主线程将被中断以及其他线程之一可以打印其Hello World的确切时间点将取决于操作系统调度程序根据主线程已经运行了多长时间、系统中的其他活动、外部(I/O)事件等做出的决定。
编辑以在下面包含我的评论:
你看到3个,然后4个,然后只有2个"Hello Worlds“的原因是你创建了线程,但你并没有等待它们真正得到调度和运行。当你的主循环结束时,程序就死了,不管你的其他线程是否有机会运行。如果您希望所有线程都完成,则需要在从main返回之前对每个线程执行一次pthread_join。
发布于 2009-11-05 20:28:36
如果你是指答案的顺序,是的,它将是不同的,因为哪个线程运行是由Linux调度器决定的。
更详细地说:创建线程后,它们获得CPU时间的顺序取决于底层的OS调度器(这里是Linux调度器)。这可能不是每次都是一样的。
发布于 2009-11-05 20:38:03
您看不到其他线程执行的原因,根据您对其他答案的评论,是因为您的main()函数(以及您的程序)在其他线程有机会执行之前返回。如果您在main()返回之前放置一个sleep(5),您将看到它们被执行。
https://stackoverflow.com/questions/1680224
复制相似问题