当前位置: 首页 > news >正文

学校网站框架汉阳网站建设哪家便宜

学校网站框架,汉阳网站建设哪家便宜,西宁网站建设君博正规,025网站建设本小节将对线程各方面的细节做深入讨论#xff0c;其主要包括线程与信号之间牵扯的问题、线程与进程控制#xff08;fork()、exec()、exit()等#xff09;之间的交互。之所以出现了这些问题#xff0c;其原因在于线程技术的问世晚于信号、进程控制等#xff0c;然而线程的…本小节将对线程各方面的细节做深入讨论其主要包括线程与信号之间牵扯的问题、线程与进程控制fork()、exec()、exit()等之间的交互。之所以出现了这些问题其原因在于线程技术的问世晚于信号、进程控制等然而线程的出现必须要能够兼容现有的这些技术不能出现冲突这就使得线程与它们之间的结合使用将会变得比较复杂当中所涉及到的细节问题也会比较多。 线程与信号 Linux 信号模型是基于进程模型而设计的信号的问世远早于线程自然而然线程与信号之间就会存在一些冲突其主要原因在于信号既要能够在传统的单线程进程中保持它原有的功能、特性与此同时又需要设计出能够适用于多线程环境的新特性 信号与多线程模型之间结合使用将会变得比较复杂需要考虑的问题将会更多在实际应用开发当中如果能够避免我们应尽量避免此类事情的发生但尽管如此事实上信号与多线程模型确实存在于实际的应用开发项目中。本小节我们就来讨论信号与线程之间牵扯的问题。 1. 信号如何映射到线程 信号模型在一些方面是属于进程层面由进程中的所有线程线程共享的而在另一些方面是属于单个线程层面的以下对其进行汇总 信号的系统默认行为是属于进程层面。8.3 小节介绍到每一个信号都有其对应的系统默认动作当进程中的任一线程收到任何一个未经处理忽略或捕获的信号时会执行该信号的默认操作信号的默认操作通常是停止或终止进程。 信号处理函数属于进程层面。进程中的所有线程共享程序中所注册的信号处理函数 信号的发送既可针对整个进程也可针对某个特定的线程。在满足以下三个条件中的任意一个时信号的发送针对的是某个线程 产生了硬件异常相关信号譬如 SIGBUS、SIGFPE、SIGILL 和 SIGSEGV 信号这些硬件异常信号在某个线程执行指令的过程中产生也就是说这些硬件异常信号是由某个线程所引起那么在这种情况下系统会将信号发送给该线程。 当线程试图对已断开的管道进行写操作时所产生的 SIGPIPE 信号 由函数 pthread_kill()或 pthread_sigqueue()所发出的信号稍后介绍这两个函数这些函数允许线程向同一进程下的其它线程发送一个指定的信号。 除了以上提到的三种情况之外其它机制产生的信号均属于进程层面譬如其它进程调用 kill()或sigqueue()所发送的信号用户在终端按下 CtrlC、Ctrl\、CtrlZ 向前台进程发送的 SIGINT、SIGQUIT 以及 SIGTSTP 信号。 当一个多线程进程接收到一个信号时且该信号绑定了信号处理函数时内核会任选一个线程来接收这个信号意味着由该线程接收信号并调用信号处理函数对其进行处理并不是每个线程都会接收到该信号并调用信号处理函数这种行为与信号的原始语义是保持一致的让进程对单个信号接收重复处理多次是没有意义的。 信号掩码其实是属于线程层面的也就是说信号掩码是针对每个线程而言。8.9 小节向大家介绍了信号掩码的概念并介绍了 sigprocmask()函数通过 sigprocmask()可以设置进程的信号掩码事实上信号掩码是并不是针对整个进程来说而是针对线程对于一个多线程应用程序来说并不存在一个作用于整个进程范围内的信号掩码管理进程中的所有线程那么在多线程环境下各个线程可以调用 pthread_sigmask()函数来设置它们各自的信号掩码譬如设置线程可以接收哪些信号、不接收哪些信号各线程可独立阻止或放行各种信号。 针对整个进程所挂起的信号以及针对每个线程所挂起的信号内核都会分别进行维护、记录。 8.11.1 小节介绍到调用 sigpending()会返回进程中所有被挂起的信号事实上sigpending()会返 回针对整个进程所挂起的信号以及针对每个线程所挂起的信号的并集。 2. 线程的信号掩码 对于一个单线程程序来说使用 sigprocmask()函数设置进程的信号掩码在多线程环境下使用pthread_sigmask()函数来设置各个线程的信号掩码其函数原型如下所示 #include signal.h int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);pthread_sigmask()函数就像 sigprocmask() 一 样 不 同 之 处 在 于 它 在 多线 程 程 序 中 使用所以pthread_sigmask()函数的用法与 sigprocmask()完全一样这里就不再重述 每个刚创建的线程会从其创建者处继承信号掩码这个新的线程可以调用 pthread_sigmask()函数来改变它的信号掩码。 3. 向线程发送信号 调用 kill()或 sigqueue()所发送的信号都是针对整个进程来说的它属于进程层面具体该目标进程中的哪一个线程会去处理信号由内核进行选择。事实上在多线程程序中可以通过 pthread_kill()向同一进程中的某个指定线程发送信号其函数原型如下所示 #include signal.h int pthread_kill(pthread_t thread, int sig);参数 thread也就是线程 ID用于指定同一进程中的某个线程调用 pthread_kill()将向参数 thread 指定的线程发送信号 sig。 如果参数 sig 为 0则不发送信号但仍会执行错误检查。函数调用成功返回 0失败将返回一个错误编号不会发送信号。 除了 pthread_kill()函数外还可以调用 pthread_sigqueue()函数pthread_sigqueue()函数执行与 sigqueue类似的任务但它不是向进程发送信号而是向同一进程中的某个指定的线程发送信号。其函数原型如下所示 #include signal.h #include pthread.h int pthread_sigqueue(pthread_t thread, int sig, const union sigval value);参数 thread 为线程 ID指定接收信号的目标线程目标线程与调用 pthread_sigqueue()函数的线程是属于同一个进程参数 sig 指定要发送的信号参数 value 指定伴随数据与 sigqueue()函数中的 value 参数意义相同。 pthread_sigqueue()函数的参数的含义与 sigqueue()函数中对应参数相同意义相同。它俩的唯一区别在于sigqueue()函数发送的信号针对的是整个进程而 pthread_sigqueue()函数发送的信号针对的是某个线程。 4. 异步信号安全函数 应用程序中涉及信号处理函数时必须要非常小心因为信号处理函数可能会在程序执行的任意时间点被调用从而打断主程序。接下来介绍一个概念---异步信号安全函数async-signal-safe function。 前面介绍了线程安全函数作为线程安全函数可以被多个线程同时调用每次都能得到预期的结果但是这里有前提条件那就是没有信号处理函数参与换句话说线程安全函数不能在信号处理函数中被调用否则就不能保证它一定是安全的。所以就出现了异步信号安全函数。 异步信号安全函数指的是可以在信号处理函数中可以被安全调用的线程安全函数所以它比线程安全函数的要求更为严格可重入函数满足这个要求所以可重入函数一定是异步信号安全函数。而线程安全函函数的要求更为严格可重入函数满足这个要求所以可重入函数一定是异步信号安全函数。而线程安全函数则不一定是异步信号安全函数了。 举个例子下面列举出来的一个函数是线程安全函数 static pthread_mutex_t mutex;static int glob 0;static void func(int loops){int local;int j;for (j 0; j loops; j) {pthread_mutex_lock(mutex); //互斥锁上锁local glob;local;glob local;pthread_mutex_unlock(mutex);//互斥锁解锁}} 该函数虽然对全局变量进行读写操作但是在访问全局变量时进行了加锁避免了引发竞争冒险它是一个线程安全函数假设线程 1 正在执行函数 func刚刚获得锁也就是刚刚对互斥锁上锁而这时进程收到信号并分派给线程 1 处理线程 1 接着跳转去执行信号处理函数不巧的是信号处理函数中也调用了 func()函数同样它也去获取锁由于此时锁处于锁住状态所以信号处理函数中调用 func()获取锁将会陷入休眠、等待锁的释放。这时线程 1 就会陷入死锁状态线程 1 无法执行锁无法释放如果其它线程也调用 func()那它们也会陷入休眠、如此将会导致整个程序陷入死锁 通过上面的分析可知涉及到信号处理函数时要非常小心。之所以涉及到信号处理函数时会出现安全问题笔者认为主要原因在以下两个方面 ⚫ 信号是异步的信号可能会在任何时间点中断主程序的运行跳转到信号处理函数处执行从而形成一个新的执行流信号处理函数执行流。 ⚫ 信号处理函数执行流与线程执行流存在一些区别信号处理函数所产生的执行流是由执行信号处理函数的线程所触发的它俩是在同一个线程中属于同一个线程执行流。 在异步信号安全函数、可重入函数以及线程安全函数三者中可重入函数的要求是最严格的所以通常会说可重入函数一定是线程安全函数、也一定是异步信号安全函数。通常对于上面所列举出的线程安全函数 func()如果想将其实现为异步信号安全函数可以在获取锁之前通过设置信号掩码在锁期间禁止接收该信号也就是说将函数实现为不可被信号中断。经过这样处理之后函数 func()就是一个异步信号安全函数了。 Linux 标准 C 库和系统调用中以下函数被认为是异步信号安全函数 _Exit()_exit()abort()accept()access()aio_error()aio_return()aio_suspend()alarm()bind()cfgetispeed()cfgetospeed()cfsetispeed()cfsetospeed()chdir()chmod()chown()clock_gettime()close()connect()creat()dup()dup2()execle()execve()fchmod()fchown()fcntl()fdatasync()fork()execl()fstat()fsync()ftruncate()getegid()geteuid()getgid()getgroups()getpeername()getpgrp()getpid()getppid()getsockname()getsockopt()getuid()kill()link()listen()lseek()lstat()mkdir()mkfifo()open()execv()pause()pipe()poll()posix_trace_event()pselect()raise()read()readlink()recv()recvfrom()recvmsg()rename()rmdir()select()sem_post()send()sendmsg()sendto()setgid()setpgid()setsid()setsockopt()setuid()shutdown()sigaction()sigaddset()sigdelset()sigemptyset()sigfillset()sigismember()signal()sigpause()sigpending()sigprocmask()sigqueue()sigset()sigsuspend()sleep()sockatmark()socket()socketpair()stat()symlink()faccessat()tcdrain()tcflow()tcflush()tcgetattr()tcgetpgrp()tcsendbreak()tcsetattr()tcsetpgrp()time()timer_getoverrun()timer_gettime()timer_settime()times()umask()uname()unlink()utime()wait()waitpid()write()fchmodat()fchownat()fexecve()fstatat()futimens()linkat()mkdirat()mkfifoat()mknod()mknodat()openat()readlinkat()renameat()symlinkat()unlinkat()utimensat()utimes()fchdir()pthread_kill()pthread_self()pthread_sigmask() 上所列举出的这些函数被认为是异步信号安全函数可以通过 man 手册查询执行命令man 7 signal 如下所示 异步信号安全函数大家可以通过对比 man 手册查询到的这些异步信号安全函数来确定自己调用的库函数或系统调用是 不是异步信号安全函数这里需要说在本书的示例代码中并没有完全按照安全性要求在信号处理函数中使用异步信号安全函数譬如在本书中的示例代码中信号处理函数中调用了 printf()用于打印信息事实上这个函数是一个非异步信号安全函数当然在一个实际的项目应用程序当中不能这么用但是本书只是为了方便输出打印信息而已。 所以对于一个安全的信号处理函数来说需要做到以下几点 ⚫ 首先确保信号处理函数本身的代码是可重入的且只能调用异步信号安全函数 ⚫ 当主程序执行不安全函数或是去操作信号处理函数也可能会更新的全局数据结构时要阻塞信号的传递。
http://www.w-s-a.com/news/53578/

相关文章:

  • h5响应式网站模板制作巴南网站制作
  • 网站方案报价软文什么意思
  • 电子商城网站如何建设上海公司车牌价格
  • 丽江网站设计公司专业公司网站设计企业
  • iis怎么建设网站特色产品推广方案
  • 道路建设网站专题品牌网站建设特色大蝌蚪
  • 网站开发组合 所有组合如何做com的网站
  • 电商网站怎么做的Wordpress 报表的插件
  • 纹理网站推荐买了两台服务器可以做网站吗
  • 机关公文写作网站南宁互联网推广
  • 五指山网站开发价格免费申请网站域名
  • 帝国音乐网站怎么做数据表电脑优化软件
  • 做国外网站收款怎么收建筑人才招聘网站
  • 毕设做桌面端还是网站sns社交网站 建设
  • 建设一个网站需要注意哪些内容wordpress 进销存
  • 沈阳市建设局网站sem优化师是什么意思
  • 餐饮vi设计公司网站排名优化方法讲解
  • 无线昆明官方网站可以做书的网站
  • 信誉最好的20个网投网站凡科网站建设之后怎么删除
  • 天津网站开发技术广州网站优化公司排名
  • 养老做增减的网站医院网站怎么做优化排名
  • 企业网站的推广方法有哪些上海猎头公司前十名
  • 电商网站建设建议免费下载app
  • 网站搭建设计是什么意思百度地图放到网站上
  • 东莞网站建设市场分析淘宝网站框架
  • 新网站多久被百度收录网站空间单位
  • 2017常用的网站昆明网站代理
  • 成都海鸥手表网站安阳网站建设策划
  • 做好的网站怎么发布做网站应该做哪方面的
  • 可以找厂家的网站品牌创意型网站开发