面向对象程序设计:基于面向对象操作系统开发平台(OSKit)的分析与程序设计(3)来源: 发布时间:星期四, 2009年2月12日 浏览:36次 评论:0
作者:汤海京 线程分析篇的线程通信 本文是 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 众所周知 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Linux支持许多区别形式 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() OSKit ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 线程间通信 3.1.1消息队列 OSKit提供 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() OSKit将消息描述成在内核地址空间 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 3.1.2信号 尽管大多数线程间通信是计划好 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 在OSKit中 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 下面我们再谈谈信号 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 在信号 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 信号 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() SIG_DFL信号专用 ![]() 如果默认动作是暂停线程 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 把挂起信号 ![]() ![]() ![]() SIG_IGN忽略信号 该信号 ![]() 系统不允许把SIGKILL或SIGTOP信号 ![]() 指向 ![]() ![]() 信号 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 用C语言 ![]() ![]() ![]() ![]() void func (signo) ![]() func( )是指定 ![]() ![]() ![]() ![]() 如果SIGFPE,SIGILL或SIGSEGV信号不是由C标准定义 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 系统不允许线程捕获SIGKILL和SIGSTOP信号 ![]() 如果线程为SIGCHLD信号建立信号捕获 ![]() ![]() ![]() ![]() ![]() ![]() 每 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 符号名 信号值 描述 是否符合POSIX SIGHUP 1 在控制终端上检测到挂断或控制线程死亡 是 SIGINT 2 交互注意信号 是 SIGQUIT 3 交互中止信号 是 SIGILL 4 检测到非法硬件 ![]() SIGTRAP 5 从陷阱中回朔 否 SIGABRT 6 异常终止信号 是 SIGEMT 7 EMT 指令 否 SIGFPE 8 不正确 ![]() SIGKILL 9 终止信号 是 SIGBUS 10 总线 ![]() SIGSEGV 11 检测到非法 ![]() ![]() SIGSYS 12 系统call ![]() ![]() SIGPIPE 13 在无读者 ![]() SIGALRM 14 报时信号 是 SIGTERM 15 终止信号 是 SIGURG 16 IO信道紧急信号 否 SIGSTOP 17 暂停信号 是 SIGTSTP 18 交互暂停信号 是 SIGCONT 19 如果暂停则继续 是 SIGCHLD 20 子线程终止或暂停 是 SIGTTIN 21 后台线程组 ![]() SIGTTOU 22 后台线程组 ![]() SIGIO 23 允许I/O信号 否 SIGXCPU 24 超出CPU时限 否 SIGXFSZ 25 超出文件大小限制 否 SIGVTALRM 26 虚时间警报器 否 SIGPROF 27 侧面时间警报器 否 SIGWINCH 28 窗口大小 ![]() SIGINFO 29 消息请求 否 SIGUSR1 30 保留作为用户自定义 ![]() SIGUSR2 31 保留作为用户自定义 ![]() 请求按默认 ![]() SIG_DFL (void (*)( ![]() 请求忽略信号 SIG_IGN (void (*)( ![]() 注意: 信号队列中最多允许有64个信号 3.2 pthreads/pthread_ipc.c 此源码文件包括了 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 3.2.1 消息发送: 介绍说明:当 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() oskit_error_t oskit_ipc_send ( pthread_t dst,void *msg, oskit_size_t msg_size, oskit_s32_t timeout ) dst:目标地址 *msg:指向消息 ![]() msg_size:消息大小(32位无符号整形) timeout:超时 3.2.2 send ![]() 发送 ![]() ![]() ![]() ![]() assert_ ![]() disable_ ![]() pthread_lock (&target->waitlock); 通过条件,检测目标线程是否在等待接受: a:目标线程 ![]() b:目标线程号存在 c:目标线程等于任意 ![]() d:消息大小不为0 条件成立: a && ( b || c) && d ![]() ![]() &&(target->ipc_state.tid ![]() ![]() { ![]() { Memcpy(target->ipc_state.msg, msg,MIN(msg_size,target->ipc_state.msg_size)); ![]() err = OSKIT_ERANGE; } } 把数据 ![]() ![]() target->ipc_state.msg_size = msg_size; target->ipc_state.tid = pthread->tid; 清除接受位: target->waitflags &= ~THREAD_WS_IPCRECV_WAIT; pthread_unlock ( &target->waitlock ); 注意: flagA & = ~flagB 实际上就是将flagB中等于1 ![]() 发送队列: queue_enter ( &target->ipc_state.senders,pthread,pthread_thread_t*, ipc_state.senders_chain) &target->ipc_state.senders:发送线程 ![]() pthread_thread_t *:指向消息 ![]() ipc_state.senders_chain:发送队列 ![]() 队列间参数传递: pthread->ipc_state.msg = msg; /* 消息 */ pthread->ipc_state.msg_size = msg_size; /* 消息 ![]() pthread->ipc_state.tid = dst; /* 消息 ![]() ![]() pthread->waitflags = THREAD_WS_IPCSEND_WAIT; /* 0
相关文章
读者评论发表评论 |