Linux 多线程编程(三)
来源:互联网 发布:台湾数据库 编辑:程序博客网 时间:2024/06/06 23:22
转自:http://blog.csdn.net/anxuegang/article/details/6674201
继续昨天的线程同步,条件变量(Condition Variables)是用于线程间,通信共享数据状态改变的机制。
中间的矩形代表条件变量,当线程线位于矩形内,表示线程等待该条件变量。位于中心线下下方,则表示signal了该条件变量。处于低谷电平的属于等待状态,高电平的属于运行状态
#include <pthread.h>
#include "error.h"
typedef struct my_struct_tag {
pthread_mutex_t mutex;
pthread_cond_t cond;
int value;
} my_struct_t;
my_struct_t data = {
PTHREAD_MUTEX_INITIALIZER,
PTHREAD_COND_INITIALIZER,
0
};
int main() {
return 0;
}
#include "error.h"
typedef struct my_struct_tag
{
pthread_mutex_t mutex;
pthread_cond_t cond;
int value;
} my_struct_t;
int main()
{
my_struct_t* data;
data = (my_struct_t*)malloc(sizeof(my_struct_t));
if(data == NULL)
ERROR_ABORT(errno,"Allocate structure");
int status;
status = pthread_mutex_init(&data->mutex, NULL);
if(status != 0)
ERROR_ABORT(status, "Initial mutex");
status = pthread_cond_init(&data->cond, NULL);
if(status != 0)
ERROR_ABORT(status, "Initial condition");
/* .... */
status = pthread_cond_destroy(&data->cond);
if(status != 0)
ERROR_ABORT(status, "Destroy cond");
status = pthread_mutex_destroy(&data->mutex);
if(status != 0)
ERROR_ABORT(status, "Destroy mutex");
free(data);
return 0;
}
#include <time.h>
#include "error.h"
#include <errno.h>
typedef struct my_struct_tag
{
pthread_mutex_t mutex;
pthread_cond_t cond;
int value;
} my_struct_t;
my_struct_t data = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0};
int hibernation = 1;
void* wait_thread(void* arg)
{
int status;
sleep(hibernation);
status = pthread_mutex_lock(&data.mutex);
if(status != 0)
ERROR_ABORT(status, "Lock mutex");
data.value = 1;
status = pthread_cond_signal(&data.cond);
if(status != 0)
ERROR_ABORT(status, "Singal cond");
status = pthread_mutex_unlock(&data.mutex);
if(status != 0)
ERROR_ABORT(status, "Unlock mutex");
return NULL;
}
int main(int argc, char* argv[])
{
pthread_t tid;
int status;
struct timespec timeout;
if(argc > 1)
hibernation = atoi(argv[1]);
status = pthread_create(&tid, NULL, wait_thread, NULL);
if(status != 0)
ERROR_ABORT(status, "Create wait thread");
timeout.tv_sec = time(NULL) + 2;
timeout.tv_nsec = 0;
status = pthread_mutex_lock(&data.mutex);
if(status != 0)
ERROR_ABORT(status, "Lock mutex");
while(data.value == 0)
{
status = pthread_cond_timedwait(&data.cond, &data.mutex, &timeout); //等待被唤醒
if(status == ETIMEDOUT)
{
printf("Condition wait timed out.\n");
break;
}
else if(status != 0)
ERROR_ABORT(status, "timewait");}
if(data.value != 0)
printf("Condition wa signaled!\n");
status = pthread_mutex_unlock(&data.mutex);
if(status != 0)
ERROR_ABORT(status, "Unlock mutex");
}
例程:
#include "error.h"
#include <pthread.h>
#include <time.h>
#include <string.h>
#include <errno.h>
typedef struct alarm_tag
{
struct alarm_tag* link;
int seconds;
time_t time;
char message[64];
} alarm_t;
pthread_mutex_t alarm_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t alarm_cond = PTHREAD_COND_INITIALIZER;
alarm_t* alarm_list = NULL;
time_t current_alarm = 0;
/**
* alarm_mutex need to be locked
*/
void alarm_insert(alarm_t* alarm)
{
int status;
alarm_t* next;
alarm_t** last;
last = &alarm_list;
next = *last;
while(next != NULL)
{
if(next->time >= alarm->time)
{
alarm->link = next;
*last = alarm;
break;
}
last = &next->link;
next = next->link;
}
if(next == NULL)
{
*last = alarm;
alarm->link = NULL;
}
/*for test: output the list*/
printf("[list: ");
for(next = alarm_list; next != NULL; next = next->link)
{
printf("%d(%d)[\"%s\"] ", next->time, next->time-time(NULL), next->message);
}
printf("]\n");
if(current_alarm ==0 || alarm->time < current_alarm)
{
current_alarm = alarm->time;
status = pthread_cond_signal(&alarm_cond);
if(status != 0)
ERROR_ABORT(status,"Signal cond");
}
}
void* alarm_thread(void* arg)
{
alarm_t* alarm;
int sleep_time;
time_t now;
int status, expired;
struct timespec cond_time;
while(1)
{
status = pthread_mutex_lock(&alarm_mutex);
if(status != 0)
ERROR_ABORT(status, "lock");
current_alarm = 0;
while(alarm_list == NULL)
{
status = pthread_cond_wait(&alarm_cond, &alarm_mutex);
if(status != 0 )
ERROR_ABORT(status, "Wait cond");
}
alarm = alarm_list;
alarm_list = alarm->link;
now = time(NULL);
expired = 0;
if(alarm->time > now)
{
printf("[wating: %d(%d)\"%s\"]\n", alarm->time, alarm->time - time(NULL), alarm->message);
cond_time.tv_sec = alarm->time;
cond_time.tv_nsec = 0;
current_alarm = alarm->time;
while(current_alarm == alarm->time)
{
status = pthread_cond_timedwait(&alarm_cond, &alarm_mutex,&cond_time);
if(status == ETIMEDOUT)
{
expired = 1;
break;
}
}
if(!expired)
alarm_insert(alarm);
}else
expired = 1;
if(expired)
{
printf("(%d) %s\n", alarm->seconds, alarm->message);
free(alarm);
}
status = pthread_mutex_unlock(&alarm_mutex);
if(status != 0)
ERROR_ABORT(status, "Unlock mutex");
}
return 0;
}
int main()
{
pthread_t pid;
int status;
char line[128];
status = pthread_create(&pid, NULL, alarm_thread, NULL);
if(status != 0)
ERROR_ABORT(status, "pthread_create");
while(1)
{
fprintf(stdout, "Alarm>");
fgets(line, sizeof(line), stdin);
if(strlen(line) <= 0)
continue;
alarm_t* alarm = (alarm_t*)malloc(sizeof(alarm_t));
if(alarm == NULL)
ERROR_ABORT(errno,"memory can't allocated!");
if(sscanf(line, "%d %s", &alarm->seconds, alarm->message) != 2)
{
printf("Bad Command\n");
free(alarm);
continue;
}
status = pthread_mutex_lock(&alarm_mutex);
if(status != 0)
ERROR_ABORT(status, "pthread mutex locking..");
alarm->time = time(NULL) + alarm->seconds;
/* insert into list*/
alarm_insert(alarm);
status = pthread_mutex_unlock(&alarm_mutex);
if(status != 0)
ERROR_ABORT(status, "pthread mutex unlocking...");
}
return 0;
}
- Linux 多线程编程(三)
- Linux 多线程编程(三)
- linux 多线程编程指南(三)
- linux c 多线程编程练习(三)
- Linux多线程编程(三)互斥锁和信号量编程例子
- 多线程编程(三)
- Linux下的多线程编程(三) 杂七杂八
- Linux socket编程(三) 简单的多线程聊天室
- Linux socket编程(三) 简单的多线程聊天室
- Linux socket编程(三) 简单的多线程聊天室
- Linux多线程编程(三)线程同步之互斥量
- Linux多线程编程(三)——线程特定数据
- Linux 多线程编程( POSIX )( 三 )------->信号灯
- Linux 多线程编程( POSIX )( 三 )------->代码区
- Linux 多线程编程( POSIX )( 三 )------->信号灯
- Linux多线程编程讲解之系列三
- 多线程编程笔记(三)
- python 多线程编程(三)
- [Effective WX] wxPropertyGrid遇上wxWS_EX_VALIDATE_RECURSIVELY产生的BUG
- 常用排序及性能分析(未完)
- Linux 多线程编程(一)
- 冒泡排序
- Linux多线程编程(二)
- Linux 多线程编程(三)
- 移动医疗正风靡 众人拾柴火焰高
- java设计模式之策略模式
- CF321B Ciel and Duel
- 内存错误:CRT detected that the application wrote to memory after end of heap buffer
- v$sqlarea,v$sql,v$sqltext提供的sql语句区别
- dm3730和dm6437,dm6446,AM335x启动过程的不同
- 用java执行php文件并得到运行结果
- Lua脚本之语法基础快速入门