线程:pthread_create()输出混乱

时间:2010-11-24 13:38:21

标签: multithreading

我正在尝试使用pthread_create创建线程。线程,从它们的启动例程,'cout'到控制台创建后的一个简单的消息。我正在尝试从主函数打印线程Id。 我的代码是:

#include <iostream>
#include <pthread.h>
#include <sstream>
#include <string>
using namespace std;


void* start_proc(void* threadNo)
{




   pthread_mutex_t display;


  if(pthread_mutex_init(&display, NULL) != 0) {

     exit(-1);   
     }

   pthread_mutex_lock(&display);

   stringstream buf;

   buf<<"Initialized threadNo = "<<*((int*)threadNo);
   buf<<endl;

   cout<<buf.str();

   pthread_mutex_unlock(&display); 

   pthread_exit(NULL);

    return(0);
}

int main()
{



  int i =0;
  int k =0;


  pthread_t threadCount[5];

  for(k=0; k<5; k++)
     {
      int* ptr = &k;
      int errorCode=pthread_create(&threadCount[k], NULL, start_proc, (void*)ptr );



    pthread_mutex_t display2;

     if(pthread_mutex_init(&display2, NULL) != 0) {

     exit(-1);   
     }



      pthread_mutex_lock(&display2);

      stringstream buf2;

      buf2<<"threadCount  "<<threadCount[k];
      buf2<<endl;

      cout<<buf2.str();

      pthread_mutex_unlock(&display2);   




       if(errorCode)
        {
  cout<<"Error: return code from pthread_create= "<<errorCode<<endl;

 exit(-1);

 } 

     } 

   pthread_exit(NULL);

 return(0);

 }  

现在当我一个接一个地运行a.out时,我得到了

  

初始化的threadNo = 0
  threadCount 2
  threadCount 3
  初始化的threadNo = 1
  threadCount 4
  初始化的threadNo = 2
  threadCount 5
  初始化的threadNo = 4
  初始化的threadNo = 4
  threadCount 6

     

初始化的threadNo = 0
  threadCount 2
  threadCount 3
  初始化的threadNo = 1
  threadCount 4
  threadCount 5
  初始化的threadNo = 3
  threadCount 6
  初始化的threadNo = 4
  初始化的threadNo = 5

     

threadCount 2
  threadCount 3
  threadCount 4
  threadCount 5
  threadCount 6
  初始化的threadNo = 5
  初始化的threadNo = 5
  初始化的threadNo = 5
  初始化的threadNo = 5
  初始化的threadNo = 5

每次我运行它都会得到一些不同的模式。可以帮助解释为什么会这样吗? 我是第一次没有狡猾的cout,然后我在NET中查找并将其纳入尝试使其线程安全

1 个答案:

答案 0 :(得分:1)

  1. pthread_mutex_t display;在线程函数(以及main::for)中是本地的,因此每个线程都锁定并解锁不同的互斥锁。

  2. 您将k的地址传递给线程函数,第一个线程与第五个线程相同。