我正在尝试使用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 = 5threadCount 2
threadCount 3
threadCount 4
threadCount 5
threadCount 6
初始化的threadNo = 5
初始化的threadNo = 5
初始化的threadNo = 5
初始化的threadNo = 5
初始化的threadNo = 5
每次我运行它都会得到一些不同的模式。可以帮助解释为什么会这样吗? 我是第一次没有狡猾的cout,然后我在NET中查找并将其纳入尝试使其线程安全
答案 0 :(得分:1)
pthread_mutex_t display;
在线程函数(以及main::for
)中是本地的,因此每个线程都锁定并解锁不同的互斥锁。
您将k
的地址传递给线程函数,第一个线程与第五个线程相同。