线程控制之条件变量 标签: 线程的可结合和分离 上一次我写了互斥锁,这次来写一下总能用到互斥锁的条件变量. 因为要保证条件变量能被正常的修改,条件变量就要受到特殊保护,实际使用的过程中互斥锁扮演者这样一个必不可少的保护者的角色. 条件变量是利用线程间共享的全局变量进行同步的一种机制.(条件变量宏观上类似于if语句,符合条件就能执行某段程序,否则只能等待条件成立 ) 使用条件变量主要包括两个动作:①一个等待使用资源的线程,等待”条件变量被设置为真”; ②另一个线程在使用完资源后”设置条件为真”. 这样就可以实现线程间的同步了. 同样来举个栗子: 别人给你提供了了办公室,还提供了锁子,但你被制造出来后pthread_cond_init,就像你玩手机(老式手机),你本该开开心心工作,但是你的主人要求你只要遇到等待pthread_cond_wait(无条件等待) pthread_cond_timewait(计时等待)你就必须停在那里打开你的锁,让出房间给别人,直到你接收到了继续 继续阅读 >>


胡锦雲 18/08/13 08:17:03
线程最大的特点就是资源的共享性,而资源共享中同步问题是多线程编程的难点. Linux系统提供了多种方式处理线程间的同步关系,其中最常用的就是互斥锁,条件变量和异步信号.下面就来让我们看看这些都是怎么用的吧(ˇˍˇ) (一)互斥锁 举个栗子: 假如现在有一个办公室每次只能进一人,你现在要在这个房间奋斗早早完成工作好把工作室让给别人用-.- 但是由于工作需求,你在进行工作的时候会不停进出这个房间,那么在你出去的时候,这就给啦别人可乘之机, 他就会利用这个空挡在现在属于你的办了公室乱捣乱,把你的办公室弄的乱七八糟,或者做一些他的事情.让你回去时摸不着头脑目瞪口呆ing… 那么你该怎么办呢? 就需要给办公室上个锁啦! 那么你需要做的事是什么呢 (就跟把大象放进冰箱需要几步一个意思(ーー゛)) 首先买个锁(pthread_mutex_init),然后看看有没有人用你想用的办公室. 有人用(资源被别线程占用,或已经挂了一把锁子)你现在可能会有两个想法涌入脑海: 1.我等!先 继续阅读 >>


胡锦雲 18/08/10 11:30:58
守护进程 标签: Linux系统编程之进程 Daemon(守护进程)是运行在后台的一种特殊进程.没有控制终端与之相连. 特点:独立于终端控制,周期性地执行某种任务 守护进程启动方式: 从启动脚本/etc/rc.d; 由作业规划crond启动; 又用户终端(通常是shell)执行 编写守护进程要点: * 让程序在后台执行.方法是fork产生一个子进程,然后使得父进程退出. pid_t pid; pid = fork();/*产生子进程*/ if(pid > 0) exit(0); /*结束父进程使得子进程成为后台进程*/ else if(pid < 0) exit(-1); 调用setsid创建一个新对话框.控制终端,登录会话和进程组通常是从父进程继承下来的.守护进程要摆脱他们,不受他们的影响,其方法是调用setsid使进程称为一个会话组长.(setsid可以创建一个新的对话) (当进程是会话组长时调用setsid失败,但是第一点已经保证进程不是会话组长) 会话(s 继续阅读 >>


胡锦雲 18/07/31 09:30:25
简化版chmod命令 标签(空格分隔): Linux —使用系统调用实例 在实现之前首先说一下#include< 一个简单的系统编程: #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> int main(int argc, char **argv) { int mode;//权限 int mode_u; int mode_g; int mode_o; char *path; //检查参数个数的合理性 if(argc < 3) { printf("%s <mode num> <target file>"); exit(0); } //获取命令行参数 mode = atoi(a 继续阅读 >>


胡锦雲 18/07/30 00:36:59
标签: Linux系统编程 Linux下系统编程是什么? 程序员使用系统调用或c语言本身所携带的库函数来设计和编写具有某一特定功能的程序,就为系统编程。(比如下文中我自己写的my_chmod指令) 系统调用是什么? 系统调用是操作系统提供给程序员使用的接口,(如作为系统调用提供的open函数用于打开一个文件,又如c语言的函数库也是系统调用实现的,只不过它封装了系统调用,并在此基础上为方便程序员使用增加了一节功能) 如何使用系统调用 Linux为上层应用的开发提供了丰富的系统调用,应用程序只需包含相应的头文件(如 #include < sys/stat.h >等等)就可以使用这些函数啦。 注意:可通过 “ man ×××× ”查看想要用的函数原型 ,如果既是Linux命令,又是系统调用,输入 “ man 2 ×××× “,对于库函数,则输入man 3 <库函数名> 系统调用的的一个实例应用 具体见我的另一篇博客 https://www.zyb 继续阅读 >>


胡锦雲 18/07/30 00:21:52
标签: Linux系统调用编程 目录的创建和删除 目录的创建可以由mkdir系统调用来实现 其函数原型为 #include<sys/types.h> #include<sys/stat.h> int mkdir (const char *pathname, mode_t mode); mkdir创建一个新的空目录。空目录中自动创建. 和 .. 目录项 所创建目录的存取许可权,由mode(mode &~ umask)决定。 新创建目录的uid与创建该进程的uid一致。如果父目录设置了st_gid位,则新目录同样也设置st_gid位。 (注:目录被设置st_gid位后,任何用户在此目录下创建的文件组的id与该目录组id相同)。 rmkdir #include<unistd.h> int rmkdir(const char *pathname) 注:只能删除pathname指定的 空目录。 获取当前目录 每个进程(运行中 继续阅读 >>


胡锦雲 18/07/29 23:22:16
信号处理 一、信号的捕捉和处理 1、signal函数 signal函数用来设置进程在接收到信号时的动作 #include <signal.h> typedef void (*sighandler_t) (int); sighandler_t signal(int signum, sighandler_t handler); signal根据参数signum指定的信号编号来设置该信号的处理函数,当指定的信号到达时就会跳转到参数handler指定的函数执行。如果参数handler不是函数指针,则必须时常数SIG_IGN(忽略该信号)或SIG_DFL(对该信号执行默认操作)。handler是一个函数指针,它所指向的函数的类型时sighandler_t,即它所指向的函数有一个int型参数,且返回值的类型为void。 signal函数执行成功时返回以前的信号处理函数指针,当有错误发生时返回SIG_ERR(即 -1)。 2、sigaction函数 sigaction函数可以用来检查或设置进程在接收到信号时的动作 #includ 继续阅读 >>


闫钰晨 16/10/07 18:09:19
Linux信号介绍 一、信号解释 信号是一种软件中断,它提供了一种处理异步事件的方法,也是进程间唯一的异步通信方式。在linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某进程发生了什么事件,还可以给进程传递数据。 二、信号的来源 硬件方式 1.当用户在终端上按下某些键时,将产生信号。 2.硬件异常产生信号:除数为0,无效的存储访问等。这些事件通常由硬件(如CPU)检测到,并将其通知给Linux操作系统内核,然后内核生成相应的信号,并把信号发送给该时间发生时正在运行的程序。 软件方式 1.用户在终端下调kill命令向进程发送任意信号。 2.进程调用kill或sigqueue函数发送信号。 3.当检测到某种软件条件已经具备时发出信号,如由alarm或settimer设置的定时器超时时将生成SIGALRM信号。 三、信号的种类 1、可靠信号与不可靠信号 SIGHUP(1号)至SIGSYS(31号)之间的信号都是继承自UNIX系统,是不可靠信号。Linux系统根据P 继续阅读 >>


闫钰晨 16/10/07 15:01:21
一、私有数据 1.特殊的变量 多线程环境下,进程内的所有线程共享进程的数据空间,因此全局变量为所有线程共有。在程序设计中有时需要保存线程自己的全局变量,这种特殊的变量仅在某个线程内部有效。举例来说,errno它返回标准的出错代码,errno不应该为局部变量,几乎每个函数都应该可以访问它,但它又不能为全局变量,否则在一个线程里输出的很可能是另一个线程的出错信息。这个问题可以通过创建线程的私有数据(Thread-specific Data ,或TSD)来解决。 2.TSD池(关键数据结构数组) 创建一个TSD就相当于将结构体数组中的某一项设置为”in_use”,并将其索引返回给*key,然后设置destructor函数为destr_function。 3.一键多值 线程私有数据采用了一键多值的技术,。访问数据时都是通过键值来访问。操作线程私有函数的主要函数有4个 #include <pthread.h> int pthread_key_creat(pthread_key_t *key, void (*destr func 继续阅读 >>


闫钰晨 16/08/04 11:35:30
一、线程 1.线程是什么 线程是计算机中独立运行的最小单位,运行时占用很少说的系统资源。 2.线程的优点 多线程相对于多进程的优点 [1].多进程的情况下,每个进程都有自己独立的地址空间,而多线程情况下,同一进程内的线程共享进程的地址空间。因此创建一个新的进程时就要耗费时间来为其分配系统资源,而创建一个新的线程花费的时间则要少的多。 [2].在系统调度方面,由于进程地址独立而线程共享地址空间,线程间的切换速度要远远快过进程间的切换速度。 [3].在通信机制方面,进程间的数据空间相互独立,彼此通信要以专门的通信方式进行,通信时必须经过操作系统。而同一进程内的多个线程共享数据空间,一个线程的数据可以直接提供给其他线程使用,而不必经过操作系统。因此,线程间的通信更加方便和省时。 线程还具有如下优点 [4].可以提高应用程序的响应速度。 [5].可以提高多处理器效率。 [6].可以改善程序的结构。 3.线程私有的数据、 虽然线程在进程内部共享地址空间,打开文件描述符等资源,但是线程也有其私有的数据信 继续阅读 >>


闫钰晨 16/08/03 10:30:22