资源简介
linux c 开发中多线程的典型实例,可在linux平台直接运行,通过实践熟悉理解多线程工作原理。

代码片段和文件信息
#include
#include
#include “errors.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;
void alarm_insert(alarm_t *alarm)
{
int status;
alarm_t **last*next;
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;
}
#ifdef DEBUG
printf(“[list: “);
for(next = alarm_list;next != NULL;next = next->link)
printf(“%d(%d)[\“%s\“]“next->timenext->time-time(NULL)next->message);
printf(“]\n“);
#endif
if(current_alarm == 0 || alarm->time < current_alarm)
{
current_alarm = alarm->time;
status = pthread_cond_signal(&alarm_cond);
if(status != 0)
err_abort(status“Signal cond“);
}
}
void *alarm_thread(void *arg)
{
alarm_t *alarm;
struct timespec cond_time;
time_t now;
int statusexpired;
status = pthread_mutex_lock(&alarm_mutex);
if(status != 0)
err_abort(status“Lock mutex“);
while(1)
{
current_alarm = 0;
while(alarm_list == NULL)
{
status = pthread_cond_wait(&alarm_cond&alarm_mutex);
if(status != 0)
err_abort(status“Wait on cond“);
}
alarm = alarm_list;
alarm_list = alarm->link;
now = time(NULL);
expired = 0;
if(alarm->time > now)
{
#ifdef DEBUG
printf(“[waiting: %d(%d)\“%s\“]\n“alarm->timealarm->time-time(NULL)alarm->message);
#endif
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(status != 0)
err_abort(status“Cond timedwait“);
}
if(!expired)
alarm_insert(alarm);
}
else
expired = 1;
if(expired)
{
printf(“(%d) %s\n“alarm->secondsalarm->message);
free(alarm);
}
}
}
int main(int argcchar *argv[])
{
int status;
char line[128];
alarm_t *alarm;
pthread_t thread;
status = pthread_create(&threadNULLalarm_threadNULL);
if(status != 0)
err_abort(status“Create alarm thread“);
while(1)
{
printf(“Alarm> “);
if(fgets(linesizeof(line)stdin) == NULL)
exit(0);
if(strlen(line) <= 1)
continue;
alarm = (alarm_t *)malloc(sizeof(alarm_t));
if(alarm == NULL)
{
errno_abort(“Allocate alarm“);
}
if(sscanf(line“%d %64[^\n]“&alarm->secondsalarm->message) < 2)
{
fprintf(stderr“Bad command\n“);
free(alarm);
}
else
{
status = pthread_mutex_lock(&alarm_mutex);
if(status != 0)
err_abort(
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2012-08-01 15:23 linux c 多线程\
文件 3215 2012-08-01 15:22 linux c 多线程\alarm_cond.c
文件 469 2012-08-01 15:23 linux c 多线程\errors.h
相关资源
- WCE注入工具
- ModelGoon-4.4.1-site.zip
- AsyncTask文件控制暂停和继续,在状态
- Visio大全模具(含Cisco、IBM等常用拓扑
- 信号奇异点Lipschitz指数计算
- 基于STM32RCT6的步进电机驱动程序
- 酒店管理系统基于Qt Creator5)
- 用友NC开发API字典
- Navicat Premium 15汉化包.zip55438
- 登录注册界面.zip48872
- 条码字体barcode128
- Rational Rose Common破解文件
- res10_300x300_ssd_iter_140000.caffemodel与dep
- scratch 第1课 翻跟斗的小猫(入门)
- stm32f407上的两个can发送和接收例程
- Scrach 欢乐狙击手.sb2
- 04741计算机网络原理知识点整理.docx(
- Wolfram Mathematica 矩阵初等变换函数(
- pscad近海风电模型 Fortran语言
- 程序员专用字体YaHei.Consolas.1.11b42517
- scratch3.0 源程序(说相声)
- AutoCAD永久去教育版破解补丁
- 开源1A锂电池充电板TP4056原理图+PCB
- m1卡 ic卡可选择扇区初始化加密软件
- TSCC.exe
- 欧姆龙CP1系列单轴定位PLC程序.cxp
- 用Beckhoff(倍福)PLC读写巴鲁夫RFID
- CVSNT 完整覆盖版防TortoiseCVS中文乱码
- pfc 使用说明.doc
- Scratch 飞机大战.sb3
评论
共有 条评论