linux下实现程序异步执行
来源:互联网 发布:手机淘宝店铺首页红包 编辑:程序博客网 时间:2024/05/16 05:59
目标:main()函数调用数据采集函数,在main函数结束并返回后,数据采集函数仍然可以执行
尝试1:多线程 muliple threads
思想:使用pthread_create()函数在main函数内创建新线程,期望main函数的结束不会影响子线程,使其能长期执行下去
实验代码:
#include <pthread.h>#include <iostream>#include <sys/wait.h>using namespace std;pthread_t id_thread_1,id_thread_2;int data_common;pthread_mutex_t lock_threads = PTHREAD_MUTEX_INITIALIZER;void * add(void *arg){ for(int k = 0;k<20;k++) { usleep(200000); pthread_mutex_lock(&lock_threads); data_common+= 321; cout<<"function add is executing..." <<data_common<<endl; pthread_mutex_unlock(&lock_threads); } return ((void *)0);}void * sub(void *arg){ for(int m=0;m<30;m++) { usleep(300000); pthread_mutex_lock(&lock_threads); data_common -= 91; cout<<"function sub is executing..." <<data_common<<endl; pthread_mutex_unlock(&lock_threads); } return ((void *)0);}int main(int argc,char **argv){ int err; void *tret; err = pthread_create(&id_thread_1,NULL,add,NULL); if(err!=0) { cerr << "pthread_create(add) error !"<<endl; exit(-1); } err = pthread_create(&id_thread_2,NULL,sub,NULL); if(err!=0) { cerr << "pthread_create(add) error !"<<endl; exit(-1); } err = pthread_join(id_thread_1,&tret); if(err !=0) { cerr << "can not join with thread "<< id_thread_1 <<endl; exit(-1); } err = pthread_join(id_thread_2,&tret); if(err !=0) { cerr << "can not join with thread "<< id_thread_2 <<endl; exit(-1); } return 0;}结果:
1。如果主线程不等待子线程结束就直接返回,那么子线程当即死亡(仅仅指在终端看不到执行结果)
2。如果主线程等待子线程执行结束再返回,那么所有线程将同步结束
结论:使用线程的方法行不通,尝试1失败。
尝试2:使用软定时器+信号
思想:使用软定时器,每隔一定时间,就产生一个指定的信号。而将需要定期执行的函数设置为该信号的处理函数。以此来实现函数的定期执行。
实验代码:
#include <signal.h> #include <sys/time.h> #include <sys/wait.h>#include <string.h> #include <stdio.h> #include <unistd.h>const char *prompt="时间已经过去了0.5秒钟\n"; unsigned int len; void prompt_info(int signo) {printf(prompt);//write(STDERR_FILENO,prompt,len); }void init_sigaction(void){struct sigaction act;act.sa_handler=prompt_info;//信号处理函数act.sa_flags=0;sigemptyset(&act.sa_mask);//用来将act.sa_mask信号集初始化并清空sigaction(SIGALRM,&act,NULL);//查询活设置信号处理方式}void init_time(){struct itimerval value;value.it_value.tv_sec=0;value.it_value.tv_usec=500000;value.it_interval=value.it_value;setitimer(ITIMER_REAL,&value,NULL);}int main(){len=strlen(prompt);init_sigaction();init_time();usleep(4000000); return 0;}
实验结果:函数执行完毕时软定时器自动失效。函数进入sleep状态后软定时器也失效。
结论:软定时器方法无效,失败。
尝试3:使用fork函数 创建新进程
思想:函数被调用时由父进程返回,子进程继续处理数据。
实验代码:
#include <iostream>#include <sys/wait.h>#include <sys/types.h>#include <unistd.h>#include <cstring>using namespace std;pid_t sub(){ pid_t pd; char *cmd; pd = fork(); switch(pd) { case -1: cout << "fork() error !"<<endl; return 1; case 0: cout << "This is the child process ."<<endl; goto label_child; default: cout << "My child process pid ="<<pd<<endl; goto label_parent; }label_child: cmd= new char[2]; memset(cmd,0,2*sizeof(char)); *cmd=0x0d; cout <<"Child process executing ..."<<endl; usleep(1000); for(int m =10;m<123456;m++) { printf("%8d",m); fflush(stdout); usleep(10000); printf(cmd); } free(cmd); return 0;label_parent: return pd;}int main(){ pid_t p = sub(); cout << "Child is still executing ..." "Press any key to kill the child."<<endl; getc(stdin); char *cmd = new char[100]; memset(cmd,0,100*sizeof(char)); sprintf(cmd,"kill %d",p); system(cmd); free(cmd); cout << "Game over!"<<endl; return 0;}
实验结果:可以实现函数调用结束后继续执行的功能。
结论:成功
尝试4:使用定时器+中断处理函数
实验代码:未做 ^_^
结果:应该比前几个都要好
- linux下实现程序异步执行
- Linux下实现跟踪程序执行信息记录日志文件
- linux下定时执行程序
- Linux下socket异步通讯聊天程序
- Linux下socket异步通讯聊天程序
- 用线程池(Thread Pool)实现异步执行程序
- python 实现异步执行
- 在linux下定时执行PHP程序
- linux下crontab自动执行class程序
- Linux下cron定时执行Java程序
- Linux操作系统下后台执行程序
- linux 下独立执行java程序
- Linux 下独立执行Java程序
- linux 下程序的执行方式
- linux/windows下定时执行java程序
- linux下C程序执行过程
- linux下编译执行C程序
- linux下的awk程序执行
- js 动态操作表格
- Trace:Incorrect string value: '\xAD\xBF The...' for column ...
- Sizeof与Strlen的区别与联系
- 两分钟彻底让你明白Android Activity生命周期(图文)!
- hdu 2304
- linux下实现程序异步执行
- MessageBox的常见用法
- JNI:Java Native Interface
- vc++深入详解第六章
- cocos2dx中继承ccsprite无法响应问题
- framebuffer 简介
- 电脑快捷键大全
- OK6410裸机调试(使用串口,不需要使用JLINK)
- 用Socket在局域网内进行广播