关于C中POSIX线程的问题

时间:2012-01-08 20:00:26

标签: c multithreading concurrency pthreads posix

#include <pthread.h>
#define NUM_THREADS 4

void *work(void *i){
    printf("Hello, world from %i\n", pthread_self());
    pthread_exit(NULL); 
}

int main(int argc, char **argv){
    int i;
    pthread_t id[NUM_THREADS];
    for(i = 0; i < NUM_THREADS; ++i){
       if(pthread_create(&id[i], NULL, work, NULL)){
          printf("Error creating the thread\n"); exit(19);
       } 
    }
    printf("After creating the thread. My id is: %i\n",
    pthread_self());
    return 0;
}

我知道输出是:

Hello, world from 2
Hello, world from 3
After creating the thread. My id is: 1
Hello, world from …

首先,这不是作业。 POSIX不是我的领域,所以我只想要输出的解释(不需要解释因为我知道他们做了什么而使用的函数)一些快速的答案:

  1. 是系统指定的pthreads(2,3,1)的ID?
  2. ++i使用了......它是否以某种方式影响了输出?
  3. 为什么最后只有4个线程(3 + main)为什么不是5?!
  4. 为什么在主打印后创建....另一个线程执行?? !!怎么来的?? !!

4 个答案:

答案 0 :(得分:4)

  1. 我不确定它是否已指定,但我相信(差不多?)所有线程ID都是从1(主要)开始并从那里开始增加。
  2. 不,++i与输出无关。
  3. 由于你没有pthread_join线程,main函数(以及程序)在最后一个线程执行之前退出。
  4. 我不确定你在这里问的确切是什么,但答案是并发。无法保证线程执行的时间或顺序。

答案 1 :(得分:1)

  1. 它们是当前进程内线程的ID。
  2. 不,i不影响输出,因为您没有将它作为参数传递给线程,也没有从线程代码中访问它。因此,它只是一个循环变量。
  3. 我不知道有多少输出,因为你没有给我们全部输出。我同意通常应该有5个线程。在主线程退出之前,某些线程可能没有时间打印它们的消息。您应该在退出主线程之前加入它们。
  4.  for(i = 0; i < NUM_THREADS; i++)
     {
         pthread_join(id[i], NULL);
     }
    

    4.Threads与主线程并行启动。因此,您启动的每个线程的代码在启动后与主线程的代码同时执行。这意味着当子线程正在执行其工作时,主线程继续执行printf,因此输出以“随机”方式交错。

答案 2 :(得分:1)

3&amp; 4:线程是异步的:使用pthreads,当你退出main函数时,所有线程都会终止,无论它们是否已经完成。

因此在main退出循环之前只打印了3个线程,在main的print语句和返回之间打印了1个,并且一个线程没有那么远。

答案 3 :(得分:0)

pthread_self不会返回数字类型,而是 opaque类型 pthread_t(可能是一些不透明的struct)。

我建议您使用

清除阵列
  memset(id, 0, sizeof(id));

的确,在GNU / Linux / Debian / Sid / x86-64上,内部包含文件/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h已经

  typedef unsigned long int pthread_t;

但我认为你不应该相信它是一个线程的标识,只是一个不透明的句柄(就像文件描述符一样)。

我建议你阅读一篇关于pthreads的好教程,例如:布莱斯巴尼this one

在今天的多核机器上,线程[可能]在不同核心上并行运行。