线程随机出现 运行.. 只有在线程创建后减慢连接速度后才可靠

Threads appear to run randomly.. Reliable only after slowing down the join after thread creation

我正在使用 pthreads 观察到奇怪的行为。注意下面的代码-

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <pthread.h>
#include <unistd.h>


typedef struct _FOO_{
  int ii=0;
  std::string x="DEFAULT";
}foo;


void *dump(void *x)
{
  foo *X;
  X = (foo *)x;
  std::cout << X->x << std::endl;
  X->ii+=1;
}



int main(int argc, char **argv)
{

  foo X[2];
  const char *U[2] = {"Hello", "World"}; 
 
  pthread_t t_id[2];
  int t_status[2];

  /*initalize data structures*/
  for(int ii=0; ii < 2; ii+=1){
    X[ii].x=U[ii];
  }
  

  foo *p = X;
  for(int ii=0; ii < 2; ii+=1){
    t_status[ii] = pthread_create(&t_id[ii], NULL, dump, (void *)p);
    std::cout << "Thread ID = " << t_id[ii] << " Status = " << t_status[ii] << std::endl;
    p+=1;
  }

  //sleep(1);    /*if this is left commented out, one of the threads do not execute*/
  
  for(int ii=0; ii < 2; ii+=1){
    std::cout << pthread_join(t_status[ii], NULL) << std::endl;
  }

 
  for(int ii=0; ii < 2; ii+=1){
    std::cout << X[ii].ii << std::endl;
  }
  
}

当我将 sleep(1)(在线程创建和加入之间)调用注释掉时,我在 2 个线程 运行 中随机只有 1 个线程出现不稳定行为 运行。

rajatkmitra@butterfly:~/mpi/tmp$ ./foo
Thread ID = 139646898239232 Status = 0
Hello
Thread ID = 139646889846528 Status = 0
3
3
1
0

当我取消注释 sleep(1) 时。两个线程都可靠地执行。

rajatkmitra@butterfly:~/mpi/tmp$ ./foo
Thread ID = 140072074356480 Status = 0
Hello
Thread ID = 140072065963776 Status = 0
World
3
3
1
1

pthread_join() 应该阻止程序退出,直到两个线程都完成,但在这个例子中,如果没有 sleep() 函数,我将无法实现。我真的不喜欢 sleep() 的实现。有人可以告诉我是否遗漏了什么吗??

参见 Peter 的注释 -

pthread_join 应该使用线程 ID 调用,而不是 pthread_create 返回的状态值。所以:pthread_join(t_id[ii], NULL),而不是 pthread_join(t_status[ii], NULL)。更好的是,因为问题被标记为 C++,所以使用 std::thread。 – 皮特·贝克尔