首页 > 代码库 > Linux 多线程编程

Linux 多线程编程

      这篇文章总结下 Linux 中多线程编程中能用到的几个函数,当然,需要同步操作的时候还需要加锁的操作,这里,没有列举的这么具体,只是把最常用的函数介绍下。

      在编写多线程程序在编译的时候需要加上 -lpthread,因为用到了 pthread 库。

/**
	头文件:
		#include <pthread.h>
	功能:
		创建一个线程
	参数:
		tid : 用于返回线程 id
		attr : 设置线程的属性,如线程优先级,初始栈大小等,一般使用默认值,即 NULL
		func :线程执行函数,从定义中可以看出,它返回 void* 类型,参数也是 void* 类型
		arg :传递给线程的参数,如果参数不止一个,需要用结构体传递
	返回值:
		执行成功返回 0, 执行失败返回一个非 0 值
*/
int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func) (void *), void *arg);

/**
	头文件:
		#include <pthread.h>
	功能:
		等待一个线程,类似于 wait4() 函数,即用于释放线程所占的资源
	参数:
		tid :指定要等待的线程 id
		status :用于带回线程的返回值
	返回值:
		执行成功返回 0, 执行失败返回一个错误编码
*/
int pthread_join (pthread_t tid, void ** status);

/**
	头文件:
		#include <pthread.h>
	功能:
		用于返回当前线程的 id
	返回值:
		线程 id
		注: typedef unsigned long int pthread_t;
*/
pthread_t pthread_self (void);

/**
	头文件:
		#include <pthread.h>
	功能:
		分离线程,类似于把一个进程变成后台进程,即脱离当前的控制终端,那么,我们就不需要
		调用 pthread_join 函数去等待这个线程的执行结束
	参数:
		tid :需要分离的线程 id
	返回值:
		执行成功返回 0, 执行失败返回一个错误编码
*/
int pthread_detach (pthread_t tid);

/**
	头文件:
		#include <pthread.h>
	功能:
		一般在线程执行函数的最后添加这么一条语句,也可以不写,代表写线程生命周期的结束,
		注意,线程执行函数的最后不能写 exit 函数,因为,这样会使整个进程结束,当进程结束
		时,由于会回收整个地址空间,而线程是共享进程地址空间的,所以,进程内所有的线程
		都会终止,会成为程序的一个 BUG
	参数:
		用于带回线程结束的返回值
*/
void pthread_exit (void *status);

      最后,给出一个利用这些函数的例子:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

#define THREAD_COUNT		2

void 	dlut_print_thread_id();
void * 	dlut_thread_func(void *arg);

int main(int argc, char **argv, char **environ)
{
	int i = 0;

	pthread_t tid[THREAD_COUNT];

	void *status;

	for (i = 0; i != THREAD_COUNT; i++)
	{
		pthread_create((pthread_t *)&tid[i], NULL, dlut_thread_func, (void *)"BruceZhang");
	}

	for (i = 0; i != THREAD_COUNT; i++)
	{
		pthread_detach(tid[i]);
	}
	
	sleep(1);

	return 0;
}

void dlut_print_thread_id(char *s)
{
	pthread_t tid;

	tid = pthread_self();

	printf("%s : this new thread‘s id is %d\n", s, (int)tid);
	

	return;
}

void * dlut_thread_func(void *arg)
{
	dlut_print_thread_id((char *)arg);

	return (void *)0;
}


Linux 多线程编程