● 概述
Linux下进行多线程编程,要包含头文件<pthread.h>,编译时要连接pthread库(-lpthread)。例如:gcc –o test test.c –lpthread
一篇讲的很全的文章:http://www.cnblogs.com/BiffoLee/archive/2011/11/18/2254540.html
● 线程的创建
创建线程的函数是pthread_create。若创建线程成功则返回0,否则返回错误编号。
原型:pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *
(start_routine)(void*), void *arg);
参数说明:
thread:指向线程标示符的指针。这个值不能为空。
attr:用来设置线程的属性。一般情况下可以设置为空采用默认属性。
start_routine:线程的入口函数。
arg:传递给start_routine的参数。
最简单的使用例子:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *thrFun(void *param)
{
int i=0;
while (i++<5)
{
printf("in thrFun: %d\n", i);
sleep(2);
}
}
int main()
{
pthread_t ntid;
void *retval;
pthread_create(&ntid, NULL, thrFun, NULL);
pthread_join(ntid, &retval); //等待线程结束
return 0;
}
pthread_t的定义:typedef unsigned long int pthread_t;
一个线程可以用pthread_self(void)获取自己的线程ID。
● 线程的退出
有三种方式:
1 线程执行完后退出。
2 线程本身显示调用pthread_exit函数退出。
pthread_exit (void * retval);
3 其它线程调用pthread_cancel函数终止线程。
pthread_cancle(pthread_t thread);
● 等待线程结束
使用pthread_join等待某个线程的结束。
pthread_join (pthread_t thread, void** threadreturn);
第一个参数为线程ID,第二个参数为返回值指针。两个参数都不能为空。注意第二个参数的定义:void *retval;
● 修改线程的属性
属性不能直接设置,需要通过相应的函数来进行设置。
数据结构为pthread_attr_t
初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数之前调用。属性对象主要包括是否绑定、是否分离、堆栈地址、堆栈大小、优先级。
默认的属性为非绑定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。
设置线程绑定状态的函数为pthread_attr_setscope,它有两个参数,第一个是指向属性结构的指针,第二个是绑定类型,它有两个取值:PTHREAD_SCOPE_SYSTEM(绑定的)和PTHREAD_SCOPE_PROCESS(非绑定的)。被绑定的线程具有较高的响应速度。
通过设置线程的绑定状态、优先级可以使线程满足实时性的要求。
如下代码创建一个绑定的线程:
pthread_t ntid; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); pthread_create(&ntid, &attr, thrFun, NULL);
线程的分离状态决定线程终止自己的方式。非分离状态的线程只有在pthread_join返回后才算终止,才能释放占用的系统资源。
设置为分离状态的线程,自己结束后,马上释放占用的系统资源。设置为分离状态的线程一般没有其它线程等待它(pthread_join()会立即返回)。
设置分离状态属性的函数:pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
第二个参数可选为PTHREAD_CREATE_DETACHED(分离线程)和 PTHREAD _CREATE_JOINABLE(非分离线程)。
另外一个常用到的属性是线程的优先级,它存放在结构sched_param中。用函数pthread_attr_getschedparam和函数
pthread_attr_setschedparam进行存放。
一般说来,我们总是先取优先级,对取得的值修改后再存放回去。这样我们可以只考虑要更新的值。
一篇详细讲解属性的文章:http://blog.csdn.net/hudashi/article/details/7709413
如下面的例子:
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <sched.h> void *thrFun(void *param) { printf("thrFun exit\n"); } int main() { pthread_attr_t attr; pthread_t tid; void *retval; struct sched_param param; int newprio=20; pthread_attr_init(&attr); pthread_attr_getschedparam(&attr, ¶m); param.sched_priority=newprio; pthread_attr_setschedparam(&attr, ¶m); pthread_create(&tid, &attr, thrFun, NULL); pthread_join(tid, &retval); return 0; }

浙公网安备 33010602011771号