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
{
......
}
- LINUX编程的线程操作
- 【Linux系统编程】线程的基本操作
- Linux C编程--线程操作1--线程概述和简单的线程操作
- linux多线程编程(有关线程操作的函数)
- Linux的线程编程
- Linux下C语言编程--线程操作
- Linux下C语言编程--线程操作
- Linux下C编程:线程操作
- Linux系统编程6.线程操作
- Linux多线程编程之线程同步操作
- Linux下的C语言编程——线程编程基本操作
- Linux下的C语言编程——线程编程基本操作
- Linux下的C语言编程——线程编程基本操作
- Linux下的C语言编程——线程编程基本操作
- Linux C编程--线程操作2--线程同步详解
- Linux C编程--线程操作3--线程属性解析
- Linux C编程--线程操作线程属性解析
- Linux下线程的操作
- java异常及其处理机制
- Java使用split()按"."切分出错解决方法
- swagger + codeception 测试自动化落地方案
- PS之图层效果
- Arcgis Javascript那些事儿(六)--arcgis js API本地环境配置
- LINUX编程的线程操作
- 【Python错误】No module named py
- 合并两个链表成一个升序链表
- 2016年观影总结
- IDEA中上传本地项目到Git
- request中的各种path
- XML解析方式
- 链表算法
- Jquery-zTree的基本用法(不错)