一个进程中的线程之间主要共享:进程的指令、大多数数据(除了私有数据)、
signal的处理方式和处理例程、进程的运行环境等。
线程之间也有它们的区别,它们各自拥有自己的线程ID、寄存器、私有的线程栈、
错误代码变量errno、信号掩码(signal mask)以及各自的优先级。
编程时,要加入<pthread.h>头文件,并在编译链接时链入Pthread库,例如
cc -lpthread -o xxx xxx.c。
线程的创建和终止
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
void pthread_exit(void *value_ptr);
线程之间的互斥
int x; /*共享全局变量*/
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mut);
/*对变量x的操作*/
...
...
pthread_mutex_unlock(&mut);
线程之间的同步
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
or
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
函数pthread_cond_broadcast用来对所有等待一个条件变量的线程解除阻塞.
函数pthread_cond_signal的作用是解除一个等待指定事件的线程的阻塞状态。
函数pthread_cond_wait的作用是等待一个事件(条件变量)发生。
函数pthread_cond_timedwait的作用是在一段指定时间内等待一个事件发生。
假设有两个共享变量x和y由互斥体mut保护,以及一个条件变量cond用来当x大于y时设置事件发生。
int x,y;
/*下面定义两个变量并初始化赋值,一个是互斥锁变量,一个是条件变量*/
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
等待x大于y事件发生的代码可以按以下方法编写:
pthread_mutex_lock(&mut);
while (x <= y)
{
pthread_cond_wait(&cond, &mut);
}
/*此处是对x和y的操作*/
...
...
pthread_mutex_unlock(&mut);
修改x和y变量使得x大于y,这样可以导致需要的事件发生:
pthread_mutex_lock(&mut);
/*修改x和y*/
...
...
if (x > y)
{
pthread_cond_broadcast(&cond);
}
pthread_mutex_unlock(&mut);
在5秒内等待x大于y的事件
struct timeval now;
struct timespec timeout;
int retcode;
pthread_mutex_lock(&mut);
gettimeofday(&now);
timeout.tv_sec = now.tv_sec + 5;
timeout.tv_nsec = now.tv_usec * 1000;
retcode = 0;
while (x <= y && retcode != ETIMEDOUT)
{
retcode = pthread_cond_timedwait(&cond, &mut, &timeout);
}
if (retcode == ETIMEDOUT)
{
/*发生超时的处理代码*/
...
...
}
else
{
/*对x和y的操作*/
...
...
}
if (retcode == ETIMEDOUT)
{
/*发生超时的处理代码*/
...
...
}
else
{
/*对x和y的操作*/
...
...
}
pthread_mutex_unlock(&mut);
线程特定数据区的函数调用
下面的代码段创建了一个TSD键,并给它分配了100个字符大小的空间,并在线程退出时自动释放:
/*定义将使用的TSD键变量*/
static pthread_key_t buffer_key;
/*为创建TSD键只执行一次定义变量*/
static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;
/*创建TSD键(只执行一次)并为该键存储相关的值而分配存储空间*/
void buffer_alloc(void)
{
pthread_once(&buffer_key_once, buffer_key_alloc);
pthread_setspecific(buffer_key, malloc(100));
}
/*获得TSD相关联的存储位置*/
char* get_buffer(void)
{
return (char *) pthread_getspecific(buffer_key);
}
/*创建TSD键*/
static void buffer_key_alloc(void)
{
pthread_key_create(&buffer_key, buffer_destroy);
}
/*释放为TSD键存储值而分配的相关联存储(析构函数)*/
static void buffer_destroy(void* buf)
{
free(buf);
}
868

被折叠的 条评论
为什么被折叠?



