进程同步用来实现程序并发执行时候的可再现性。
一.进程同步及异步的概念
1.进程同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
2.异步
异步的概念和同步相对。当一个异步过程调用发出后,调用者不会立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
在windows的调用中:
system("notepad");
ShellExecuteA(0, "open", "notepad", 0, 0, 1);
} 异步
#include <iostream>
#include <cstdlib>
#include <windows.h>
using namespace std;
void openQQ()
ShellExecuteA(0, "open", "D:\\qq\\Bin\\qq.exe", 0, 0, 1);
void diagonal(HWND win,int i)
if(i==900){
return ;
}else{
SetWindowPos(win,NULL,i,i*5/9,300,400,1);
Sleep(30);
diagonal(win,i+10);
void moveQQ()
HWND win;
win = FindWindowA("TXGuiFoundation", "QQ");
if (win == NULL) {
cout << "not found" << endl;
else {
cout << "get it" << endl;
for(int i=0;i<=900;i+=10){
SetWindowPos(win,NULL,i,0,300,400,1);
Sleep(30);
int i=0;
while(i<=500){
i+= 10;
SetWindowPos(win,NULL,900,i,200,400,1);
Sleep(30);
int i = 900;
Sleep(30);
i -= 10;
SetWindowPos(win,NULL,i,500,300,400,1);
}while(i);
int i =500;
AA:if(i){
i-=10;
SetWindowPos(win,NULL,0,i,300,400,1);
Sleep(30);
goto AA;
diagonal(win,0);
int main()
openQQ();
Sleep(5000);
moveQQ();
int x;
cin>>x;
return 0;
进程同步用来实现程序并发执行时候的可再现性。 一.进程同步及异步的概念 1.进程同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 2.异步 异步的概念和同步相对。当一个异步过程调用发出后,调用者不会立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。 在windows的调用中:system("notepad"); //同步ShellExe
那么就抽了点时间来聊聊他们:
什么是回调函数?
在C语言中,回调函数其实与函数指针的调用在语法上并没有太大的差异,而为什么叫回调函数主要还是从功能上给它起的名字,即这个函数会被"返回来调用"。
而这里所谓的“返回”就涉及到一个方向性问题,从哪里来到哪里去。而在软件中通常就是与“分层设计思想”挂钩的。
在软件设计领域分层.
目录非预期结果的全局变量方法一:原子操作使用代码书实现原子操作方法二:控制中断方法三、自旋锁自旋锁定义自旋锁原理方法四、信号量信号量的实现信号量的使用步骤1. 信号量初始化2. 获取信号量3. 代码执行流开始执行相关操作4. 释放信号量代码实现
非预期结果的全局变量
下面这段代码是线程中的函数与中断处理函数对全局变量a进行操作
int a = 0;
/* 中断处理程序 */
void interrupt_handle() {
/* 线程处理函数 */
void thread_func() {
在C语言中,实现软件异步重启通常可以使用以下方法:
1. fork() 函数:可以创建一个子进程,该子进程会复制父进程的代码,数据和文件描述符。可以在子进程中实现异步重启。
2. execve() 函数:可以用于加载一个新的程序在当前进程中,该函数在成功后,将替换当前进程的代码。
以下是一个示例代码,该代码创建了一个子进程,该子进程在某个特定的条件下重启该程序:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
pid_t pid;
int i;
for (i = 0; i < 10; i++) {
pid = fork();
if (pid == 0) {
/* 子进程代码 */
printf("Child process started\n");
sleep(5);
execve(argv[0], argv, NULL);
printf("Child process restarted\n");
} else {
/* 父进程代码 */
printf("Parent process\n");
sleep(1);
return 0;
请注意,在实际的生产环境中,应该对重启进行充分测试,并确保重启是正常和可靠的。