【问题标题】:Creating threads (POSIX threads)创建线程(POSIX 线程)
【发布时间】:2020-03-15 14:11:56
【问题描述】:

我想知道为什么 Master 会先执行printf(),即使 Slave 线程在代码中排在第一位?

另外,为什么它们有相同的 PID(主从)?

void* pthread_function(int id) {
  printf("[%s] Slave thread %d (PID=%d,TID=%ld)\n",timestamp(),id,getpid(),pthread_self());
  pthread_exit(NULL);
}
int main(int argc,char** argv) {
  // Create slave thread
  long int i = 1;
  pthread_t thread;
  pthread_create(&thread,NULL,(void* (*)(void*))pthread_function,(void*)(i));
  // Print message
  printf("[%s] Master thread (PID=%d,TID=%ld)\n",timestamp(),getpid(),pthread_self());
  // Wait for threads
  pthread_join(thread,NULL);
  // Terminate process OK
  return 0;
} 

输出是

[2019:11:20 00:25:25:853640] Master thread (PID=5338,TID=140000137201472)
[2019:11:20 00:25:25:853795] Slave thread 1 (PID=5338,TID=140000128689920)

对不起,我是新手,答案可能很简单,我不知道。

【问题讨论】:

    标签: c linux unix pthreads posix


    【解决方案1】:

    多个线程是独立调度的,因此内核可能决定先调度新线程还是旧线程,这取决于它的优先级和系统上正在运行的其他线程。多次运行程序可能会导致不同的结果,甚至。

    两个线程共享相同 PID 的原因是因为 POSIX 规定它们必须。即使有多个线程,也只有一个进程。内核在内部使用单独的 PID 跟踪两个线程,但 glibc 将单个 PID(主线程的 PID)公开为进程的 PID。

    【讨论】:

      【解决方案2】:

      当这个程序执行时,事件的顺序是这样的:

      • 主程序已执行。
      • 它启动了子线程。
      • 巧合的是(!)它设法在...之前打印了它的消息
      • ...新启动的子线程打印了它的消息。
      • 然后子线程死了,然后...
      • ...等待它死掉...主线程也死了。

      如果您多次运行此程序,那么最终您可能会遇到孩子“击败其父母”的情况。 (但这也与底层操作系统逻辑有关,它确保控制台的输出始终由“整个字符串”组成。两个进程/线程中的任何一个都有平等的机会首先获得它们的字符串,但是你'永远不会看到由两个字符串组成的控制台输出混合在一起。)

      源代码中语句的顺序完全不相关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多