LINUX编程的线程操作

来源:互联网 发布:diy图片制作软件 编辑:程序博客网 时间:2024/05/22 14:18

在Linux下,使用pthread库来创建和操作线程,pthread库是linux系统自带的一个库,这个库文件在/usr/lib/libpthread.so

使用时首先在Makefile里面包含库 LFLAGES += -lphread

引用头文件

#include<unistd.h>//unix标准头文件

#include<pthread.h>

程序主体:

1)定义线程的主函数

void * Thread_Main(void *content)

{

  while(1)

{

        //CODE

msleep(1)

}

return NULL;
 }

2)调用pthread_create

int mian()

{

pthread_t handle;//pthread_t 定义在pthread.h里面,用来指定一个线程对象。

pthread_create(&handle,//线程句柄

NULL,

Thread_Main,//线程入口函数

NULL)//第四个参数,即线程的参数,context的值

getchar();//不能让主线程退出

return 0;

}

pthread_create ,创建成功返回0,创建不成功返回-1;

注意:sleep函数

sleep单位是s,nanosleep单位是纳秒,但系统达不到纳秒的精度,通常指定毫秒级,5ms精度

void msleep(int ms)

{
timespec ts;

ts.tv_sec = ms /100;

ts.tv_nsec = (ms%1000) *1000000;

       nanosleep(&ts,NULL);

}

同时创建多个线程:

首先定义一个类型用来存储每个线程的ID以及需要传入的参数

struct ThreadParam

{

int id;

...//其他参数

}

Thread_Main(void * context)

{

ThreadParam *p = (ThreadParam*)context;

......

free(p);

return NULL;
}

pthread_t h1,h2;


ThreadParam *p1 = (ThreadParam*)malloc(sizeof(ThreadParam));

ThreadParam *p2 = (ThreadParam*)malloc(sizeof(ThreadParam));

..

ThreadParam *pn = (ThreadParam*)malloc(sizeof(ThreadParam));

p1->id=1;

....//给各个线程的参数赋值

使用同样的入口函数:

pthread_creat(&h1,NULL,Thread_Main,p1);

pthread_creat(&h1,NULL,Thread_Main,p2);


如何终止线程?

如果线程里面有一个while循环,则应该设置flag,设法令其自然终止。

int quit_falg = 0; 

while(quit_falg)

{
...

}

如何保证系统的资源一直有的用呢?

pthread_join就起作用了,它有两个作用,1)等待B线程自然退出,2)在B线程退出之后,回收B线程的系统资源(每个线程都是系统级的资源,一个进程内的线程的数量是受限制的)

pthread_join(handle,NULL)

其中handle是线程对象的句柄

pthread_cancel 取消线程,默认是立即取消

但是可以设置为延迟取消,当线程运行到下一个取消点时才取消

调用两个函数:

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);

pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL)

设置取消点

pthread_testcancel();

线程的面向对象封装

建立一个calss Thread

线程主函数:Tmain()

创建启动线程:RUN()

static 函数:Join Sleep,Msleep

class Thread()

{

public:

Thread();

        virtual ~Thread();

void run();//启动线程函数,函数内容为创建线程,加上线程执行的任务


private:

pthread_t pthread;

}

使用时可以重写Thread类,然后启动run函数。

互斥体与信号量

创建Mutexd对象

pthread_mutex_t hMutex;

pthread_mutex_init(&hMutex,NULL);//创建

pthread_mutex_destory(&hMutex)//销毁

使用Mutex

//获取锁,阻塞等待。。。且一直等待

pthread_mutex_lock(&hMutex)//成功时返回0

//访问共享数据

/释放锁

pthread_mutex_unlock(&hMutex)

另外一直方式:trylock,如果不能获取锁,就立即返回

信号量:

应用头文件:

#include<unistd.h>

#include<semaphore.h>

创建Semaphore对象

sem_t hSem;

sem_init(&hSem,1,initial_value);

sem_destory(&hSem)

wiat/post操作:sem_wait(&hSem);sem_post(&hSem);

超时等待sem_timedwait

在linux里面如果使用跨平台的库OSAPI?

OSAPI封装了Thread,Mutex,Semaphore等系统接口

1)在Makefile里,SUBDIR = srcosapi

2)代码里

#include" ../osapi/osapi.h"

class MYtask : public OS_Thread

{

......

}



0 0
原创粉丝点击