行云

行至水穷处,坐看云起时。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

● 概述

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, &param);
    param.sched_priority=newprio;
    pthread_attr_setschedparam(&attr, &param);
    pthread_create(&tid, &attr, thrFun, NULL);
    pthread_join(tid, &retval);

    return 0;
}

 



 

posted on 2013-01-01 15:07  windflying  阅读(964)  评论(0)    收藏  举报