创建线程实际上就是确定调用该线程函数的入口点,线程的创建采用函数 pthread_create 。在线程创建以后,就开始运行相关的线程函数,在该函数运行完之后,线程就退出,这也是线程退出的一种方式。另一种线程退出的方式是使用函数 pthread_exit ,这是线程主动退出行为。这里需要注意的是,在使用线程函数时,不能随意使用 exit 退出函数进行出错处理,由于 exit 的作用是使调用进程终止,往往一个进程包括了多个线程,所以线程中通常使用 pthread_exit 函数来代替进程中的退出函数 exit 。
  由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程终止而得到释放。正如进程之间可以通过 wait 函数系统调用来同步终止并释放资源一样,线程之间也有类似的机制,那就是 pthread_join 函数。pthread_join 函数可以用于将当前线程挂起,等待某个线程的结束,这个函数是一个线程阻塞函数,调用这个函数的线程将一直等待直到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。
  函数原型为:

	#include <pthread.h>
	int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
	void pthread_exit(void *retval);

  通常形式为:

	pthread_t pthid;
	pthread_create(&pthid, NULL, pthfunc, NULL);pthread_create(&pthid, NULL, pthfunc, (void *)3);
  	pthread_exit(NULL);pthread_exit((void *)3);	// 3 作为返回值被后面的 pthread_join 函数捕获
  	pthread_join(pthid, (void *)3);

  函数 pthread_create 用来创建线程。
  参数 thread 是传出参数,保存新线程的标识;
  参数 attr 是一个结构体指针,结构中的元素分别指定新线程的运行属性,attr 可以用 pthread_attr_init 等函数设置各成员的值,但通常传入为 NULL 即可。
  参数 start_routine 是一个函数指针,指向新线程的入口点函数,线程入口点函数带有一个 void * 的参数由 pthread_create 的第 4 个参数传入;
  参数 arg 用于传递给第 3 个参数指向的入口点函数的参数,可以为 NULL ,表示不传递
  返回值:成功返回 0;失败返回 -1。

  函数 pthread_exit 表示线程的退出,其参数可以被其他线程用 pthread_join 函数捕获。

补充:
  编译时需要带上线程库选项:-lpthread
  编译时会产生一些警告信息,是因为某些参数的类型不匹配,但这个不影响生成可执行程序,可以不管。

Logo

在这里,我们一起交流AI,学习AI,用AI改变世界。如有AI产品需求,可访问讯飞开放平台,www.xfyun.cn。

更多推荐