关于C中POSIX线程的问题

关于C中POSIX线程的问题,c,multithreading,concurrency,pthreads,posix,C,Multithreading,Concurrency,Pthreads,Posix,首先,这不是家庭作业。 POSIX不是我的领域,因此我只想对输出进行解释(无需解释所使用的函数,因为我知道它们的作用),快速回答以下问题: 系统是否指定了pthreads(2、3、1)的ID 使用的++i。。。它是否以某种方式影响了输出 为什么最后只有4个线程(3+main)为什么不是5个 为什么主要是在印刷后创作。。。。执行了另一个线程??!!怎么会呢 它们是当前进程内线程的ID 不,i不会影响输出,因为您不会将其作为参数传递给线程,也不会从线程代码内部访问它。因此,它只是一个循环变量 我不知

首先,这不是家庭作业。 POSIX不是我的领域,因此我只想对输出进行解释(无需解释所使用的函数,因为我知道它们的作用),快速回答以下问题:

  • 系统是否指定了pthreads(2、3、1)的ID
  • 使用的
    ++i
    。。。它是否以某种方式影响了输出
  • 为什么最后只有4个线程(3+main)为什么不是5个
  • 为什么主要是在印刷后创作。。。。执行了另一个线程??!!怎么会呢
  • 它们是当前进程内线程的ID
  • 不,i不会影响输出,因为您不会将其作为参数传递给线程,也不会从线程代码内部访问它。因此,它只是一个循环变量
  • 我不知道有多少输出,因为你没有给我们完整的输出。我同意通常应该有5个线程。可能有些线程在主线程退出之前没有时间打印消息。您应该在退出主线程之前加入它们
  • for(i=0;i

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

    3&4:线程是异步的:对于pthreads,当您退出主函数时,所有线程都将终止,无论它们是否已完成

    因此,在main退出循环之前,只有3个线程打印,1个线程在main的print语句和return之间打印,而一个线程没有打印到那么远

  • 我不确定是否指定了它,但我相信(几乎?)所有线程ID都是从1(主线程)开始,然后从1开始递增
  • 不,
    ++i
    与输出无关
  • 由于没有
    pthread\u加入
    线程,因此
    main
    函数(以及程序)在执行最后一个线程之前退出
  • 我不确定你到底想问什么,但答案是并发性。无法保证线程何时或以何种顺序执行
  • 不返回数字类型,但返回不透明类型(可能是某种不透明的结构)

    我建议您用

     for(i = 0; i < NUM_THREADS; i++)
     {
         pthread_join(id[i], NULL);
     }
    
    实际上,在GNU/Linux/Debian/Sid/x86-64上,内部包含文件
    /usr/include/x86\u 64-Linux-GNU/bits/pthreadtypes.h

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

    我建议你读一本关于pthreads的好教程,比如Blaise Barney的


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

    我记得pthread\u t实际上在不同的平台上定义不同。我认为在某些平台(Windows)上,它实际上是一个结构。所以要小心,pthread\u t不透明对象也是darwin(Mac OS X和iOS)上的一个结构。仅仅假设它是一个整数是不好的。第四点:你是说我不能预测输出的确切顺序吗?@Armagadon:没错。线程由操作系统打开和关闭CPU,因此它们的指令是随机交错的。不,你不能。你甚至可以在理论上把单个角色混在一起…所以你也说我不能预测确切的数字outcome@Armagadon不,你不能预测确切的结果。@Armagadon正确,你不能预测结果。事实上,如果你运行程序几次,结果可能会发生很大的变化。很好的总结,但就#1而言,
    pthread\u t
    类型甚至不再必须是算术类型,因此它们不必从1开始递增:有可能预测这个精确的输出吗?不,不可能,从一个程序运行到下一个程序,输出是不可复制的。。。
     for(i = 0; i < NUM_THREADS; i++)
     {
         pthread_join(id[i], NULL);
     }
    
      memset(id, 0, sizeof(id));
    
      typedef unsigned long int pthread_t;