linux 线程
最近在做一些应用层上的事情,其中关于线程的部分,很多印象都很模糊。这也可能是因为以前没有在应用层做过项目,
只是停留在课本,或者实验上。这里暂时对这次遇到的线程相关的函数作个记录。主要是给自己以后查看。
头文件:#include <pthread.h>
编译:需要加入 –lpthread
相关类型
pthread_t:线程ID
pthread_attr_t:线程属性
-
基本函数
-
pthread_create():创建一个线程
-
pthread_exit():终止当前线程
-
pthread_cancel():中断另外一个线程的运行
-
pthread_join():阻塞当前的线程,直到另外一个线程运行结束
-
pthread_attr_init():初始化线程的属性
-
pthread_attr_destroy():删除线程的属性
-
pthread_kill():向线程发送一个信号
-
-
同步函数
-
用于 mutex 和条件变量
-
pthread_mutex_init() 初始化互斥锁
-
pthread_mutex_destroy() 删除互斥锁
-
pthread_mutex_lock():占有互斥锁(阻塞操作)
-
pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
-
pthread_mutex_unlock(): 释放互斥锁
-
pthread_cond_init():初始化条件变量
-
pthread_cond_destroy():销毁条件变量
-
pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程
-
pthread_cond_wait(): 等待条件变量的特殊条件发生
-
pthread_attr_getschedparam();获取线程优先级
-
pthread_attr_setschedparam();设置线程优先级
-
-
工具函数
-
pthread_equal(): 对两个线程的线程标识号进行比较
-
pthread_detach(): 分离线程
-
pthread_self(): 查询线程自身线程标识号
下面是生产者,消费者问题的一个实例,也是上面这些函数的一个简单应用吧。
-
#include <stdio.h>
-
#include <pthread.h>
-
#define BUFFER_SIZE 16 // 缓冲区数量
-
struct prodcons
-
{
-
// 缓冲区相关数据结构
-
int buffer[BUFFER_SIZE]; /* 实际数据存放的数组*/
-
pthread_mutex_t lock; /* 互斥体lock 用于对缓冲区的互斥操作 */
-
int readpos, writepos; /* 读写指针*/
-
pthread_cond_t notempty; /* 缓冲区非空的条件变量 */
-
pthread_cond_t notfull; /* 缓冲区未满的条件变量 */
-
};
-
/* 初始化缓冲区结构 */
-
void init(struct prodcons *b)
-
{
-
pthread_mutex_init(&b->lock, NULL);
-
pthread_cond_init(&b->notempty, NULL);
-
pthread_cond_init(&b->notfull, NULL);
-
b->readpos = 0;
-
b->writepos = 0;
-
}
-
/* 释放线程相关 */
-
void exit_pthread(struct prodcons *b)
-
{
-
pthread_cond_destroy(&b->notempty);
-
pthread_cond_destroy(&b->notfull);
-
pthread_mutex_destroy(&b->lock);
-
}
-
/* 将产品放入缓冲区,这里是存入一个整数*/
-
void put(struct prodcons *b, int data)
-
{
-
pthread_mutex_lock(&b->lock);
-
/* 等待缓冲区未满*/
-
if ((b->writepos + 1) % BUFFER_SIZE == b->readpos)
-
{
-
pthread_cond_wait(&b->notfull, &b->lock);
-
}
-
/* 写数据,并移动指针 */
-
b->buffer[b->writepos] = data;
-
b->writepos++;
-
if (b->writepos >= BUFFER_SIZE)
-
b->writepos = 0;
-
/* 设置缓冲区非空的条件变量*/
-
pthread_cond_signal(&b->notempty);
-
pthread_mutex_unlock(&b->lock);
-
}
-
/* 从缓冲区中取出整数*/
-
int get(struct prodcons *b)
-
{
-
int data;
-
pthread_mutex_lock(&b->lock);
-
/* 等待缓冲区非空*/
-
if (b->writepos == b->readpos)
-
{
-
pthread_cond_wait(&b->notempty, &b->lock);
-
}
-
/* 读数据,移动读指针*/
-
data = b->buffer[b->readpos];
-
b->readpos++;
-
if (b->readpos >= BUFFER_SIZE)
-
b->readpos = 0;
-
/* 设置缓冲区未满的条件变量*/
-
pthread_cond_signal(&b->notfull);
-
pthread_mutex_unlock(&b->lock);
-
return data;
-
}
-
-
-
/* 测试:生产者线程将1 到100 的整数送入缓冲区,消费者线
-
程从缓冲区中获取整数,两者都打印信息*/
-
#define OVER ( - 1)
-
struct prodcons buffer;
-
void *producer(void *data)
-
{
-
int n;
-
for (n = 0; n < 100; n++)
-
{
-
printf("%d --->\n", n);
-
put(&buffer, n);
-
} put(&buffer, OVER);
-
return NULL;
-
}
-
-
-
void *consumer(void *data)
-
{
-
int d;
-
while (1)
-
{
-
d = get(&buffer);
-
if (d == OVER)
-
break;
-
printf("--->%d \n", d);
-
}
-
return NULL;
-
}
-
-
-
int main(void)
-
{
-
pthread_t th_a, th_b;
-
void *retval;
-
init(&buffer);
-
/* 创建生产者和消费者线程*/
-
pthread_create(&th_a, NULL, producer, 0);
-
pthread_create(&th_b, NULL, consumer, 0);
-
/* 等待两个线程结束*/
-
pthread_join(th_a, &retval);
-
pthread_join(th_b, &retval);
-
exit_pthread(&buffer);
-
return 0;
-
}
阅读(4213) | 评论(0) | 转发(0) |