Linux线程同步之信号C语言实例
linux中向某个线程发送信号,若没有对该信号的处理函数,则会导致程序结束。
如下面的程序,创建一个线程,主线程向其发送一个信号,会导致程序立即结束
#include <stdio.h> #include <pthread.h> pthread_t t; void* run(void* arg) { while(1) { printf("Hello\n"); } } main() { pthread_create(&t, 0, run, 0); pthread_kill(t,34); while(1); }
这就要求利用pthread_kill 与 sigwait 通过等待信号来控制线程时应添加一个信号处理函数来实现对线程的控制
改进后的控制线程程序
#include <stdio.h> #include <pthread.h> #include <signal.h> pthread_t t1, t2; sigset_t sigs; void handle(int s) { } void* r1(void* arg) { int s; while(1) { printf("1\n"); sigwait(&sigs, &s); } } void* r2(void* arg) { while(1) { sleep(1); printf("2\n"); pthread_kill(t1, 34); } } main() { signal(34, handle); sigemptyset(&sigs); sigaddset(&sigs, 34); pthread_create(&t1, 0, r1, 0); pthread_create(&t2, 0, r2, 0); while(1); }
部分效果
相关推荐
-
Linux下semop等待信号时出现Interrupted System Call错误(EINTR)解决方法
错误现象:(semop函数调用,strerror(errno)输出结果)Interrupted system call平台:RedHat Linux LINUX文档关于EINTR的描述是这样子的: While blocked in this system call, the process caught a signal.UNIX文档[IEEE Std 1003.1-2008]关于EINTR的描述是这样子的: The semop() function was interrupted by a
-
linux多线程编程详解教程(线程通过信号量实现通信代码)
线程分类 线程按照其调度者可以分为用户级线程和核心级线程两种. (1)用户级线程 用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持.在这里,操作系统往往会提供一个用户空间的线程库,该线程库提供了线程的创建.调度.撤销等功能,而内核仍然仅对进程进行管理.如果一个进程中的某一个线程调用了一个阻塞的系统调用,那么该进程包括该进程中的其他所有线程也同时被阻塞.这种用户级线程的主要缺点是在一个进程中的多个线程的调度中无法发挥多处理器的优势.
-
Python Web框架Flask信号机制(signals)介绍
信号(signals) Flask信号(signals, or event hooking)允许特定的发送端通知订阅者发生了什么(既然知道发生了什么,那我们可以知道接下来该做什么了). Flask提供了一些信号(核心信号)且其它的扩展提供更多的信号.信号是用于通知订阅者,而不应该鼓励订阅者修改数据.相关信号请查阅文档. 信号依赖于Blinker库. 钩子(hooks) Flask钩子(通常出现在蓝图或应用程序现存的方法中,比如一些内置装饰器,例如before_request)不需要Blinker
-
java信号量控制线程打印顺序的示例分享
复制代码 代码如下: import java.util.concurrent.Semaphore; public class ThreeThread { public static void main(String[] args) throws InterruptedException { Semaphore sempA = new Semaphore(1); Semaphore sempB = new Semaphore(0); Semaphore sempC = new Semapho
-
linux shell中 if else以及大于、小于、等于逻辑表达式介绍
比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注意:这里的空格很重要.要确保方括号的空格.笔者就曾因为空格缺少或位置不对,而浪费好多宝贵的时间. if ....; then....elif ....; then....else....fi[ -f "somefile" ] :判断是否是一个文件[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限[ -n "$var" ]
-
Linux下的信号详解及捕捉信号
信号的基本概念 每个信号都有一个编号和一个宏定义名称 ,这些宏定义可以在 signal.h 中找到. 使用kill -l命令查看系统中定义的信号列表: 1-31是普通信号: 34-64是实时信号 所有的信号都由操作系统来发! 对信号的三种处理方式 1.忽略此信号:大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略.它们是:SIGKILL和SIGSTOP.这两种信号不能被忽略的,原因是:它们向超级用户提供一种使进程终止或停止的可靠方法.另外,如果忽略某些由硬件异常产生的信号(例如非法存
-
Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作
一.修改操作系统核心参数 在Root用户下执行以下步骤: 1)修改用户的SHELL的限制,修改/etc/security/limits.conf文件 输入命令:vi /etc/security/limits.conf,按i键进入编辑模式,将下列内容加入该文件. oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 编辑完成后按Esc键,输入":wq"
-
linux下基于C语言的信号编程实例
本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void sig_handler(int sig_no, siginfo_t *info, void *ctext){ printf("receive si
-
Android获取当前已连接的wifi信号强度的方法
本文实例讲述了Android获取当前已连接的wifi信号强度的方法,是Android程序开发中非常常见的重要技巧.分享给大家供大家参考之用.具体方法如下: 1.得到当前已连接的wifi信息 WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifi_service.getConnectionInfo(); 其中wifiInfo有以下的方法: wifiinfo.ge
-
Linux线程同步之信号C语言实例
linux中向某个线程发送信号,若没有对该信号的处理函数,则会导致程序结束. 如下面的程序,创建一个线程,主线程向其发送一个信号,会导致程序立即结束 #include <stdio.h> #include <pthread.h> pthread_t t; void* run(void* arg) { while(1) { printf("Hello\n"); } } main() { pthread_create(&t, 0, run, 0); pthr
-
Java编程线程同步工具Exchanger的使用实例解析
本文研究的主要是Java编程线程同步工具Exchanger的使用,下面看看具体内容. 如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使用的空间,就需要用到Exchanger这个类,Exchanger为线程交换信息提供了非常方便的途径,它可以作为两个线程交换对象的同步点,只有当每个线程都在进入 exchange ()方法并给出对象时,才能接受其他线程返回时给出的对象. 每次只能两个线程交换数据,如果有多个线程,也只有两个能交换数据.下面看个通俗的例子:一手交钱一首交货! public
-
linux线程间的同步与互斥知识点总结
在线程并发执行的时候,我们需要保证临界资源的安全访问,防止线程争抢资源,造成数据二义性. 线程同步: 条件变量 为什么使用条件变量? 对临界资源的时序可控性,条件满足会通知其他等待操作临界资源的线程,类似信号. 场景:T-DAY展会排队参观/生产者消费者模型 条件变量是什么? 是一种同步机制,一个线程用于修改这个变量使其满足其它线程继续往下执行的条件,其它线程则接收条件已经发生改变的信号. 条件变量操作? 初始化和销毁 pthread_cond_wait 条件不满足 会释放锁并阻塞等待 , 这个
-
Java线程同步实例分析
本文实例讲述了Java线程同步的用法.分享给大家供大家参考.具体分析如下: 多线程的使用为我们的程序提供了众多的方便,同时它也给我们带来了以往没有考虑过的麻烦.当我们使用多线程处理共享资源时意外将会发生:比如我们一起外出就餐,每个人都是一个线程,餐桌上的食物则是共享资源,当我看到红烧鸡腿上桌后立即拿起筷子直奔目标,眼看着就得手的时候,突然---鸡腿消失了,一个距离盘子更近的线程正在得意地啃着. 为了避免上述问题的发生,Java为我们提供了"synchronized(同步化)修饰符"来避
-
JAVA线程同步实例教程
线程是Java程序设计里非常重要的概念,本文就以实例形式对此加以详细解读.具体分析如下: 首先,线程加锁有什么用处呢?举个例子:比如你现在有30000块大洋在银行存着,现在你到银行取钱,当你输入密码完成后,已经输入取款金额,比如你输入的是20000,就是在银行给你拿钱这个时刻,你老婆也去银行取这笔钱,你老婆同样取20000,因为此时你的账上仍然是30000,所以银行同样的操作在你老婆那端又进行了一遍,这样当你们两个完成各自操作后,银行记录的你账上还应该有10000块存款,这样是不是很爽.解决这个
-
C++线程同步实例分析
本文实例分析了C++线程同步问题,分享给大家供大家参考.具体分析如下: 该实例设置全局变量g_bContinue,在主线程中设置全局变量g_bContinue,工作线程检测该全局变量,实现主线程控制工作线程的目的. 打印出的g_cnt1与g_cnt2的数值不同,是因为线程调试时时间片的切换. 具体代码如下: // countError.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> DWORD
-
C++使用CriticalSection实现线程同步实例
本文实例讲述了C++使用CriticalSection实现线程同步的方法,在前文C++线程同步实例分析的基础上增加了四行代码,使用了四个函数: EnterCriticalSection ::DeleteCriticalSection ::EnterCriticalSection ::LeaveCriticalSection此时,打印出来的数字就相等了. 具体代码如下: #include "stdafx.h" #include <Windows.h> DWORD g_cnt1
-
详解易语言线程同步
在易语言官方多线程支持库中提供线程同步的方法是用许可区. 加入许可区之后可以防止多个线程同时访问公用变量是发生冲突.加入许可区的代码同时只能有一个线程访问,避免冲突. 创建许可区: 创建并返回一个进入许可证数值,此许可证值用作进入程序中的指定许可代码区,以避免多线程冲突.成功返回非零整数值,失败返回0.所创建的许可证在不再使用后,必须使用"删除进入许可证"命令将其删除.本命令为初级命令. 删除进入许可证: 删除由"创建进入许可证"命令所创建返回的进入许可证.成功返回
-
linux命令行下使用R语言绘图实例讲解
使用系统:centos 6.4 64bit 在R语言中可以使用png()等函数生成图片,例如: png("aa.png")可以生成图片. 但是如果你是通过shell远程连接到系统上,可能会碰到如下错误: > png("aa.png") 错误于.External2(C_X11, paste("png::", filename, sep = ""), g$width, : 无法打开PNG设备 此外: 警告信息: In
-
C语言细致讲解线程同步的集中方式
目录 互斥锁 条件变量 信号量 读写锁 互斥锁 使用互斥量完成对临界区的资源的加锁操作,使得同一时刻,对一个共享数据的使用只能又一个线程完成 例向屏幕上一次打印abcd四个字母 可以使用的是一个类似锁连的思想 a 加完解开后拿b锁依次类推 #define THRNUM 4 static pthread_mutex_t mut[4]; static int next(int n) { if(n + 1 == THRNUM) return 0; return n+1; } static void*
随机推荐
- Perl学习教程之单行命令详解
- 一些很恶作剧的vbs程序代码
- php正则之函数 preg_replace()参数说明
- 使用vbs脚本定时删除N天前的文件
- Objective-C中类和方法的定义以及协议的使用
- ASP.NET MVC下基于异常处理的完整解决方案总结
- WebService出现"因 URL 意外地以 结束,请求格式无法识别"的解决方法
- php Mysql日期和时间函数集合
- C#中如何利用正则表达式判断字符
- mysql limit分页优化详细介绍
- JS截取字符串常用方法整理及使用示例
- 基于jQuery实现的查看全文功能【实用】
- asp javascript值的互相传递方法
- ThinkPHP使用Smarty第三方插件方法小结
- Lua判断字符串中包含中文字符的方法和计算字符串宽度函数分享
- Java 事务详解及简单应用实例
- javascript asp教程第三课 new String() 构造器
- javascript函数特点实例分析
- php实现微信扫码自动登陆与注册功能
- 简单了解将WordPress中的工具栏移到底部的小技巧