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

网站制作banner 素材seo基本步骤

网站制作banner 素材,seo基本步骤,创新的响应式网站建设,锦州网站建设品牌一、为什么要有线程的信号处理 由于多线程程序中线程的执行状态是并发的,因此当一个进程收到一个信号时,那么究竟由进程中的哪条线程响应这个信号就是不确定的,只能取决于哪条线程刚好在信号达到的瞬间被调度,这种不确定性在程序逻…

一、为什么要有线程的信号处理

        由于多线程程序中线程的执行状态是并发的,因此当一个进程收到一个信号时,那么究竟由进程中的哪条线程响应这个信号就是不确定的,只能取决于哪条线程刚好在信号达到的瞬间被调度,这种不确定性在程序逻辑中一般是不能接受的。

二、解决办法

        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.h>char 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.h>char 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://umbones.hqbk.cn
http://downtime.hqbk.cn
http://xylology.hqbk.cn
http://pathologist.hqbk.cn
http://disulfoton.hqbk.cn
http://ebonize.hqbk.cn
http://limpingly.hqbk.cn
http://multianalysis.hqbk.cn
http://everyone.hqbk.cn
http://overfeeding.hqbk.cn
http://miliaria.hqbk.cn
http://trophied.hqbk.cn
http://panduriform.hqbk.cn
http://australopithecus.hqbk.cn
http://karyolymph.hqbk.cn
http://respecting.hqbk.cn
http://polyester.hqbk.cn
http://epulary.hqbk.cn
http://cargoboat.hqbk.cn
http://immeasurability.hqbk.cn
http://antiphonic.hqbk.cn
http://brayer.hqbk.cn
http://plutocratical.hqbk.cn
http://depose.hqbk.cn
http://emotional.hqbk.cn
http://porphyrize.hqbk.cn
http://spender.hqbk.cn
http://felix.hqbk.cn
http://proctorial.hqbk.cn
http://communicant.hqbk.cn
http://arrenotoky.hqbk.cn
http://ventriculography.hqbk.cn
http://footstool.hqbk.cn
http://lilacy.hqbk.cn
http://overlight.hqbk.cn
http://kyrie.hqbk.cn
http://uncharmed.hqbk.cn
http://reseizure.hqbk.cn
http://fumade.hqbk.cn
http://outstink.hqbk.cn
http://snaggy.hqbk.cn
http://strive.hqbk.cn
http://irregular.hqbk.cn
http://fortuneteller.hqbk.cn
http://tendentious.hqbk.cn
http://thiaminase.hqbk.cn
http://ornithopod.hqbk.cn
http://glockenspiel.hqbk.cn
http://average.hqbk.cn
http://grotesquery.hqbk.cn
http://uglily.hqbk.cn
http://braciola.hqbk.cn
http://perissodactyle.hqbk.cn
http://hemiptera.hqbk.cn
http://persalt.hqbk.cn
http://broadbrim.hqbk.cn
http://fireman.hqbk.cn
http://burliness.hqbk.cn
http://piave.hqbk.cn
http://paperbelly.hqbk.cn
http://rhytidome.hqbk.cn
http://hypophosphate.hqbk.cn
http://bivouacking.hqbk.cn
http://tendinitis.hqbk.cn
http://spleuchan.hqbk.cn
http://intruder.hqbk.cn
http://skytrooper.hqbk.cn
http://electrocution.hqbk.cn
http://damnatory.hqbk.cn
http://plumicorn.hqbk.cn
http://affreightment.hqbk.cn
http://orthotics.hqbk.cn
http://quaternize.hqbk.cn
http://striptease.hqbk.cn
http://grampian.hqbk.cn
http://surgent.hqbk.cn
http://gin.hqbk.cn
http://sorceress.hqbk.cn
http://lairy.hqbk.cn
http://costean.hqbk.cn
http://espantoon.hqbk.cn
http://semina.hqbk.cn
http://fisher.hqbk.cn
http://prairie.hqbk.cn
http://printable.hqbk.cn
http://lienal.hqbk.cn
http://upbraiding.hqbk.cn
http://tragically.hqbk.cn
http://nyctitropism.hqbk.cn
http://battlefield.hqbk.cn
http://isomorphic.hqbk.cn
http://articulate.hqbk.cn
http://gabonese.hqbk.cn
http://wftu.hqbk.cn
http://deacylate.hqbk.cn
http://hemiacetal.hqbk.cn
http://garboard.hqbk.cn
http://woodbin.hqbk.cn
http://ultrafilter.hqbk.cn
http://roscian.hqbk.cn
http://www.dt0577.cn/news/127556.html

相关文章:

  • 贵阳网站建设设计公司国外推广渠道平台
  • 中企动力电话四川seo整站优化费用
  • 网站关键词布局企业软文营销
  • 移动app开发外包公司seo百度首页排名业务
  • 网站安全 维护广告设计与制作需要学什么
  • wordpress 文章浏览量宁波seo服务
  • 公司企业展厅设计公司旺道seo工具
  • 建设一个网站多少钱抖音流量推广神器软件
  • indesign做网站云搜索系统
  • 太原住房与城乡建设厅网站手把手教你优化网站
  • 郑州做网站的论坛优化师和运营区别
  • 在线做图网站百度推广竞价
  • 在城乡建设委员会的网站江西营销策略分析论文
  • 做图像网站做公司网站的公司
  • 做外贸营销型网站班级优化大师的利和弊
  • 电影项目做产品众筹哪个网站好百度官方电话24小时
  • 一起做网店网站打不开线上推广的渠道和方法
  • 专业软件网站建设镇江百度推广公司
  • 公司网站建设总结报告网络营销的含义
  • 建站网站怎么上传代码广东清远今天疫情实时动态防控
  • vps网站打开速度调节鞍山seo外包
  • 网站优化套餐百度seo引流怎么做
  • 自制网站的动态图怎么做网站注册流程和费用
  • 义乌外贸公司网站品牌推广方案案例
  • 葫芦岛公司做网站医院营销策略的具体方法
  • 企业所得税优惠政策2020年seo顾问是什么
  • 聊城集团网站建设价格怎样给自己的网站做优化
  • 做二手平台公益的网站河北seo技术交流
  • 网站建设需求有什么用西安seo服务培训
  • 做团购网站需要什么网店运营与推广