pthread_create函数

函数原型:int pthread_create(pthread_t *tid, const pthread_attr_t *tattr, void*(*start_routine)(void *), void *arg);


功能:创建一个新的线程,并将线程加入当前进程


头文件:#include

pthread非linux系统的默认库,需手动链接-线程库 -lpthread


参数:

tid:指向线程标识符的指针

tattr:设置线程属性,可由pthread_attr_init()函数创建默认属性对象

start_routine:线程运行函数的起始地址,注意start_routine的返回值地址必须无效

arg:运行函数的参数,arg首选动态从堆上分配内存(进程,这样资源可以由程序控制回收,delete), 

从栈上(线程)分配内存可能导致地址无效或在线程终止时地址被重新分配


返回值:

pthread_create() 在调用成功完成之后返回零。其他任何返回值都表示出现了错误。如果
检测到以下任一情况,pthread_create() 将失败并返回相应的值。

EAGAIN
描述: 超出了系统限制,如创建的线程太多。
EINVAL
描述: tattr 的值无效。


案列:

#include 
#include 
#include 
#include 
using std::cout;
using std::cin;
using std::cerr;
using std::endl;

void *start_routine(void *arg)
{
	for(int i = 0; i != 5; ++i)
	{
		cout << (char *)arg << endl;
		sleep(1);
	}//pthread_self()//获取线程自身的自身id
	return nullptr;
}

int main()
{
	pthread_t tid1, tid2;
	//pthread_attr_t *attr1 = nullptr, *attr2 = nullptr;
	char args[2][10] = {"Hello", "world"};
	int ret1, ret2;
	ret1 = pthread_create(&tid1, nullptr, &start_routine, args[0]);
	if(ret1 == EAGAIN)
	{
		cerr << args[0] << " : 超出系统限制" << endl;
		exit(-1);
	}	
	if(ret1 == EINVAL)
	{
		cerr << args[0] << " : pthread_attr_t设置无效" << endl;
		exit(-2);	
	}	
	ret2 = pthread_create(&tid2, nullptr, &start_routine, args[1]);
	/*
	   pthread_attr_t attr;
	   ret2 = pthread_create(&tid2, &attr, &start_routine, args[1]);
	   attr需由pthread_attr_init()进行初始化,否侧会产生EAGAIN错误
	 */
	if(ret2 == EAGAIN)
	{
		cerr << args[1] << " : 超出系统限制" << endl;
		exit(-1);
	}	
	if(ret2 == EINVAL)
	{
		cerr << args[1] << " : pthread_attr_t设置无效" << endl;
		exit(-2);	
	}	
	sleep(10);	
	return 0;
}


你可能感兴趣的:(多线程编程)