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

做网站需要掌握的技术企业小程序制作的公司

做网站需要掌握的技术,企业小程序制作的公司,做精美ppt的网站,佛山网页设计制作一、为什么要有线程的信号处理 由于多线程程序中线程的执行状态是并发的#xff0c;因此当一个进程收到一个信号时#xff0c;那么究竟由进程中的哪条线程响应这个信号就是不确定的#xff0c;只能取决于哪条线程刚好在信号达到的瞬间被调度#xff0c;这种不确定性在程序逻…一、为什么要有线程的信号处理 由于多线程程序中线程的执行状态是并发的因此当一个进程收到一个信号时那么究竟由进程中的哪条线程响应这个信号就是不确定的只能取决于哪条线程刚好在信号达到的瞬间被调度这种不确定性在程序逻辑中一般是不能接受的。 二、解决办法 1、在多线程进程中选定某条线程去响应信号 2、其余线程对该信号进行屏蔽 三、相关函数API接口 1、发送信号给指定线程 // 在进程内部只允许在线程之间进行发送 int pthread_kill(pthread_t thread, int sig);// 接口说明返回值成功返回0失败返回错误码参数thread接收信号的线程号参数sig待发送的信号// 在进程之间进行的信号发送 int kill(pid_t pid, int sig);// 接口说明返回值成功返回0失败返回-1参数pid接受信号的进程号参数sig待发送的信号 2、发送带参数的信号给指定线程 // 发送带参数的信号给指定线程 // 线程间 int pthread_sigqueue(pthread_t thread, int sig,const union sigval value);// 接口说明返回值成功返回0失败返回-1参数thread待接收信号的线程号参数sig待发送的信号参数value额外携带的参数// 进程间int sigqueue(pid_t pid, int sig, const union sigval value);// 接口说明返回值成功返回0失败返回-1参数pid待接收信号的进程号参数sig待发送的信号参数value额外携带的参数 3、屏蔽指定信号  // 屏蔽指定信号 int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);// 接口说明返回值成功返回0失败返回-1// 参数解析 1、how操作命令字比如阻塞、解除阻塞等SIG_BLOCK阻塞set中的信号原有正在阻塞的信号保持阻塞SIG_SETMASK阻塞set中的信号原有正在阻塞的信号自动解除SIG_UNBLOCK解除set中的信号2、set当前要操作的信号集 3、oldset若为非空则将原有阻塞信号集保留到该oldset中 注意该函数的操作参数不是单个信号而是信号集。// 信号集操作函数组 int sigemptypset(sigset_t *set); // 清空信号集set int sigfillset(sigset_t *set); // 将所有信号加入信号集set中 int sigaddset(sigset_t *set, int signum); // 将信号signum添加到信号集set中 int sigdelset(sigset_t *set, int signum); // 将信号signum从信号集set中剔除 int sigsimember(const sigset_t *set, int signum); // 测试信号signum是否在信号集set中四、案例 1、使用线程结合信号的方式完成数据的接收和发送要求一条线程发送数据同时发送信号指定某条线程接收数据另外有多余线程做伪任务。 // 多线程信号处理的案例#include stdio.h #include pthread.h #include errno.h #include string.h #include unistd.h #include signal.hchar data[100]; pthread_t tid1, tid2, tid3;// 信号响应函数 void recv_handler(int sig) {printf(\nmy tid is %ld\n, pthread_self());printf(read data: %s\b, data);memset(data, 0, sizeof(data)); }// 线程1的例程函数 void *routine1(void *arg) {printf(I am recv_routine, my tid %ld\n, tid1);// 设置线程分离 pthread_detach(pthread_self()); while(1){printf(please input data:\n);fgets(data, sizeof(data), stdin);pthread_kill(tid2, 34); // 给线程2发送信号printf(send data success\n);} }// 线程2的例程函数用来接收数据 void *routine2(void *arg) {// 注册信号响应函数signal(34, recv_handler);printf(I am routine2, my tid %ld\n, tid2);// 设置线程分离 pthread_detach(pthread_self());while(1){pause();} }// 线程3的例程函数 void *routine3(void *arg) {printf(I am routine3, my tid %ld\n, tid3);// 设置线程分离 pthread_detach(pthread_self());while(1){pause();} }int main(int argc, char *argv[]) {// 创建线程1用来发送和接收数据errno pthread_create(tid1, NULL, routine1, NULL);if(errno 0){printf(pthread create routine1 success, tid %ld\n, tid1);}else{perror(pthread create routine1 fail\n);}// 创建线程2用来做多余线程errno pthread_create(tid2, NULL, routine2, NULL);if(errno 0){printf(pthread create routine2 success, tid %ld\n, tid2);}else{perror(pthread create routine2 fail\n);}// 创建线程3用来做多余线程errno pthread_create(tid3, NULL, routine3, NULL);if(errno 0){printf(pthread create routine3 success, tid %ld\n, tid3);}else{perror(pthread create routine3 fail\n);}// 一定要加这个否则主函数直接退出相当于进程退出所有线程也退出// 或者加上while(1)等让主函数不退出pthread_exit(0);return 0; } 2、使用线程结合信号的方式完成数据的接收和发送要求一条线程完成数据的发送和接收另外两个线程屏蔽信号做伪任务。 // 多线程信号处理的案例#include stdio.h #include pthread.h #include errno.h #include string.h #include unistd.h #include signal.hchar data[100]; sigset_t sigs_set; // 信号集 pid_t pid; pthread_t tid1, tid2, tid3;// 信号响应函数 void recv_handler(int sig) {printf(\nmy tid is %ld\n, pthread_self());printf(read data: %s\b, data);memset(data, 0, sizeof(data)); }// 线程1的例程函数 void *routine1(void *arg) {printf(I am routine1, my tid %ld\n, tid1);// 设置线程分离 pthread_detach(pthread_self()); while(1){printf(please input data:\n);fgets(data, sizeof(data), stdin);printf(send data success\n);kill(pid, 34); // 给进程所有线程发送信号} }// 线程2的例程函数用来接收数据 void *routine2(void *arg) {printf(I am routine2, my tid %ld\n, tid2);// 屏蔽阻塞信号集中的信号sigprocmask(SIG_BLOCK, sigs_set, NULL);// 设置线程分离 pthread_detach(pthread_self());while(1){pause();} }// 线程3的例程函数 void *routine3(void *arg) {printf(I am routine3, my tid %ld\n, tid3);// 设置线程分离 pthread_detach(pthread_self());// 屏蔽阻塞信号集中的信号sigprocmask(SIG_BLOCK, sigs_set, NULL);while(1){pause();} }int main(int argc, char *argv[]) {// 注册信号响应函数signal(34, recv_handler);sigemptyset(sigs_set); // 清空信号集sigaddset(sigs_set, 34); // 把34信号加到信号集中pid getpid(); // 获取进程号// 创建线程1用来发送和接收数据errno pthread_create(tid1, NULL, routine1, NULL);if(errno 0){printf(pthread create routine1 success, tid %ld\n, tid1);}else{perror(pthread create routine1 fail\n);}// 创建线程2用来做多余线程errno pthread_create(tid2, NULL, routine2, NULL);if(errno 0){printf(pthread create routine2 success, tid %ld\n, tid2);}else{perror(pthread create routine2 fail\n);}// 创建线程3用来做多余线程errno pthread_create(tid3, NULL, routine3, NULL);if(errno 0){printf(pthread create routine3 success, tid %ld\n, tid3);}else{perror(pthread create routine3 fail\n);}// 一定要加这个否则主函数直接退出相当于进程退出所有线程也退出// 或者加上while(1)等让主函数不退出pthread_exit(0);return 0; } 五、总结 多线程进程中的信号处理可以采用选定某一条线程来接收信号其余线程屏蔽该信号的做法可以结合案例加深对多线程中信号的处理。
http://www.w-s-a.com/news/182348/

相关文章:

  • ftp如何修改网站备案号百度云建站
  • 免费做网站空间dede二手车网站源码
  • 网站服务器需要多大设计网站公司开发
  • asp 网站权限设计做网站业务员
  • 做棋牌网站违法嘛网络服务网络推广
  • 专门做推广的网站吗免费建域名网站
  • 在百度做网站株洲网站平台搭建
  • 用node做的网站南宁网站定制开发
  • 做刷单网站犯法吗wordpress depth
  • 潍坊青州网站建设少儿编程app
  • 表白网站制作源代码自己怎么免费做网站网页
  • 开源网站建设是什么工作个人虚拟网站
  • 网站制作的一般过程优化关键词排名公司
  • 如何使用阿里云建设网站网站两边广告
  • 互联网信息服务小红书seo是什么意思
  • 深圳市南山区建设局网站公司简介网页
  • 免费小程序制作软件爱站网站seo查询工具
  • 承接电商网站建设缔烨建设公司网站
  • 网站运营介绍十大国外室内设计网站
  • 网站建设完毕后怎么加后台电影购买网站怎么设计
  • 空间ip地址访问网站音乐分享 wordpress
  • 做网站一单能挣多少wordpress主题文件夹在哪
  • 视频社区app源码台州优化网站
  • 保定高端网站建设做微商好还是开网站好
  • 有什么方法在淘宝发布网站建设设计wordpress评分
  • 自己做的网站怎么爬数据库酷播wordpress
  • 广州哪家做网站还可以黑龙江省建设厅网站的电话
  • 青海省高等级公路建设管局网站国内做led灯网站有
  • 做网站成功建设银行网站网址
  • 自动生成网站上海十大活动策划公司