c - Posix线程问题

标签 c linux posix pthreads

我试图通过示例来理解 pthreads。我编写了以下代码,每次运行时都会给出不同的答案!谁能解释一下这个错误? TIA, 斯维亚

代码在这里:

#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]$ 

最佳答案

没有错误,这就是线程的工作方式。您的主线程创建新线程,这些线程此时“准备好运行”。在某个时间点(由操作系统确定),您的主线程将被挂起,其他线程之一将运行一定时间(通常是几十毫秒)。当您的程序存在正在运行的线程时,系统将在线程之间不断切换。

您的主线程将被中断并且其他线程之一可以打印它的确切时间点 Hello World 将取决于操作系统调度程序的决定,基于您的主线程已经运行了多长时间,其他线程中的事件系统、外部(I/O)事件等。

编辑以在下面包含我的评论:

您看到 3 个,然后是 4 个,然后只有 2 个“Hello Worlds”的原因是您创建了线程,但没有等待它们真正被调度和运行。当你的主循环结束时,程序就死了,不管你的其他线程是否有机会运行。如果您希望完成所有线程,则需要在从 main 返回之前对每个线程执行 pthread_join

关于c - Posix线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1680224/

相关文章:

c - 使用 HTTP/POST 传输大文件

linux - 有没有一种方法/工具可以在 Linux 下列出标记为 "thin"的 TCP 连接?

linux - 如何确定由于新软件包安装而导致的文件系统变化

compiler-construction - 检测单个语句引发的潜在 FPU 条件

c - 如何理解 Relocation section '.rela.plt' 的字段

c - 修改现有的 do_mkdir() 系统调用以打印创建的尚不存在的文件夹

c - ring/circular Buffer - 缓冲区实现并打印头部和尾部之间的值

c - 如何避免在 Linux 上的 strftime() 中调用过多的 stat(/etc/localtime)?

c++ - c++中的popen等价物

在 shell 中用管道连接 n 个命令?