c语言编程笔录

首页 >   > 笔记大全

笔记大全

c语言进程并发

更新时间:2024-01-10

前言

并发是指系统中同时执行多个独立的任务,它可以提高系统的性能和效率。C语言提供了一些机制来实现进程并发,包括进程创建、进程间通信和进程同步等功能。在本文中,我们将探讨C语言中的进程并发,并介绍一些相关的功能和技术。

进程创建

进程是计算机中正在运行的程序的实例。C语言中,我们可以使用fork()函数来创建一个新的进程。fork()函数会复制当前进程的所有状态,并创建一个新的进程。原始进程称为父进程,新创建的进程称为子进程。父进程和子进程将在fork()函数返回后同时执行,并且具有相同的程序代码、堆栈和文件描述符等。

#include 
#include 
#include 

int main() {
    pid_t pid;
    
    // 创建新进程
    pid = fork();
    
    if (pid == -1) {
        // 进程创建失败
        perror("Failed to create process");
        return 1;
    }
    
    if (pid == 0) {
        // 在子进程中执行的代码
        printf("This is the child process\n");
        // 子进程退出
        return 0;
    } else {
        // 在父进程中执行的代码
        printf("This is the parent process\n");
        // 父进程等待子进程退出
        wait(NULL);
    }
    
    return 0;
}

进程间通信

进程间通信(IPC)是指进程之间交换数据和信息的机制。C语言提供了一些IPC机制,如管道(pipe)、消息队列(message queue)、共享内存(shared memory)和信号量(semaphore)等。这些机制可以帮助不同进程之间协调和共享资源。

// 管道示例
#include 
#include 

int main() {
    int fd[2];
    char buf[20];
    
    // 创建管道
    if (pipe(fd) == -1) {
        perror("Failed to create pipe");
        return 1;
    }
    
    // 创建子进程
    pid_t pid = fork();
    
    if (pid == -1) {
        perror("Failed to create process");
        return 1;
    }
    
    if (pid == 0) {
        // 在子进程中,向管道写入数据
        close(fd[0]); // 关闭读取端
        write(fd[1], "Hello, pipe!", 13);
        return 0;
    } else {
        // 在父进程中,从管道读取数据
        close(fd[1]); // 关闭写入端
        read(fd[0], buf, 13);
        printf("Received message: %s\n", buf);
        wait(NULL);
    }
    
    return 0;
}

进程同步

进程同步是指多个进程之间协调和顺序执行的机制。在多进程环境中,多个进程可能会并发地访问共享的资源,可能导致竞争条件(race condition)和数据不一致等问题。C语言提供了一些同步机制,如互斥锁(mutex)、条件变量(condition variable)和信号量(semaphore)等,用于解决这些问题。

// 使用互斥锁进行进程同步示例
#include 
#include 

// 共享的全局变量
int counter = 0;
pthread_mutex_t mutex;

void* increment(void* arg) {
    pthread_mutex_lock(&mutex);
    // 访问共享资源
    counter++;
    pthread_mutex_unlock(&mutex);
    return NULL;
}

int main() {
    pthread_t thread1, thread2;
    
    // 初始化互斥锁
    pthread_mutex_init(&mutex, NULL);
    
    // 创建线程
    pthread_create(&thread1, NULL, increment, NULL);
    pthread_create(&thread2, NULL, increment, NULL);
    
    // 等待线程结束
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    
    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);
    
    printf("Counter value: %d\n", counter);
    
    return 0;
}

总结

本文介绍了C语言中实现进程并发的相关知识。我们讨论了进程的创建,使用fork()函数可以在C语言中创建新的进程,并在父子进程之间执行不同的代码。我们还介绍了进程间通信,包括管道的使用及其示例,以及同步机制的使用,如互斥锁的使用示例。这些功能和技术可以帮助程序员在C语言中实现高效的并发编程。