POSIX多线程

  一个进程中的线程之间主要共享:进程的指令、大多数数据(除了私有数据)、

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值