C语言中如何进行线程和进程操作?

C语言在操作系统中提供了一些库函数,可以方便地进行进程和线程的操作。

进程操作

创建新进程

使用 fork() 函数可以在当前进程中创建一个新进程。新进程继承了父进程的所有属性,但是父进程和子进程拥有独立的内存空间。下面是一个示例:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    pid_t pid;
    pid = fork();
    if (pid < 0) { // fork失败
        perror("fork error");
    } else if (pid == 0) { // 子进程
        printf("I'm child process with pid %d\n", getpid());
    } else { // 父进程
        printf("I'm parent process with pid %d, my child's pid is %d\n", getpid(), pid);
    }
    return 0;
}

上述代码中,我们使用了 fork() 函数创建了一个新进程。父进程和子进程的 pid 是不同的,可以通过 getpid() 函数获取当前进程的 pid。运行代码,输出如下:

I'm parent process with pid 6249, my child's pid is 6250
I'm child process with pid 6250

等待进程结束

使用 waitpid() 函数可以等待进程结束。下面是一个示例:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    pid_t pid;
    pid = fork();
    if (pid < 0) { // fork失败
        perror("fork error");
    } else if (pid == 0) { // 子进程
        printf("I'm child process with pid %d\n", getpid());
        sleep(3);
    } else { // 父进程
        printf("I'm parent process with pid %d, my child's pid is %d\n", getpid(), pid);
        int status;
        waitpid(pid, &status, 0);
        printf("child process exited with status %d\n", status);
    }
    return 0;
}

上述代码中,父进程等待子进程结束,并且可以获取子进程的结束状态。运行代码,输出如下:

I'm parent process with pid 6265, my child's pid is 6266
I'm child process with pid 6266
child process exited with status 0

线程操作

使用 pthread_create() 函数可以创建新线程。新线程和主线程运行在同一个进程中,共享内存空间,但是有各自独立的栈空间。下面是一个示例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void * print_hello(void * arg) {
    printf("hello from thread %ld\n", (long)arg);
    pthread_exit(NULL);
}

int main() {
    pthread_t tid;
    int rc = pthread_create(&tid, NULL, print_hello, (void *)1);
    if (rc) {
        perror("pthread_create error");
        exit(1);
    } else {
        printf("hello from main thread\n");
    }
    pthread_join(tid, NULL);
    return 0;
}

上述代码中,我们使用 pthread_create() 函数创建了一个新线程,新线程执行了 print_hello() 函数。主线程继续执行,输出了一行信息。 pthread_join() 函数等待线程结束。运行代码,输出如下:

hello from main thread
hello from thread 1

线程间同步

使用 pthread_mutex_lock()pthread_mutex_unlock() 函数可以实现线程间同步。下面是一个示例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int counter;
pthread_mutex_t mutex;

void * increment(void * arg) {
    int i;
    for (i = 0; i < 1000000; i++) {
        pthread_mutex_lock(&mutex);
        counter++;
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit(NULL);
}

int main() {
    pthread_t t1, t2;
    pthread_mutex_init(&mutex, NULL);
    pthread_create(&t1, NULL, increment, NULL);
    pthread_create(&t2, NULL, increment, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_mutex_destroy(&mutex);
    printf("counter = %d\n", counter);
    return 0;
}

上述代码中,我们使用了 pthread_mutex_lock()pthread_mutex_unlock() 函数来保证 counter 的值能够正确地被多个线程修改。 pthread_mutex_init()pthread_mutex_destroy() 分别用来初始化和销毁互斥锁。运行代码,输出如下:

counter = 2000000

总结

本文介绍了C语言中如何进行进程和线程操作。对于进程,我们使用 fork() 函数创建新进程,使用 waitpid() 函数等待进程结束。对于线程,我们使用 pthread_create() 函数创建新线程,使用 pthread_mutex_lock()pthread_mutex_unlock() 函数实现线程间同步。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中如何进行线程和进程操作? - Python技术站

(0)
上一篇 2023年4月27日
下一篇 2023年4月27日

相关文章

  • C++实现银行排队系统

    C++实现银行排队系统 介绍 银行排队系统是一种经典的模拟系统。该系统可以模拟银行中客户的流动、排队、服务等过程。通过模拟,可以帮助银行评估服务能力,从而提高工作效率。本文将介绍如何使用C++实现银行排队系统。 系统设计 队列的实现 队列是银行排队系统的核心数据结构。在C++中,可以使用STL中的队列容器来实现队列。以下是如何定义一个整型队列: “`c++…

    C 2023年5月23日
    00
  • C++ 中的Lambda表达式写法

    当我们需要在C++中写一些短的、临时的函数时,常常使用Lambda表达式。Lambda表达式可以看作是一个匿名函数,它可以在任意处声明和定义,并且不会产生额外的开销。本文将详细讲解如何在C++中使用Lambda表达式。 基本语法 Lambda表达式的语法如下: [capture clause] (parameters) -> return_type {…

    C 2023年5月22日
    00
  • C++实现简单班级成绩管理系统

    C++实现简单班级成绩管理系统攻略 1. 需求分析 在实现班级成绩管理系统前,首先需要明确实现系统的主要功能,如本系统需要实现的功能有:- 添加学生的基本信息,包括学生姓名和学号;- 添加学生成绩信息,包括数学、语文、英语等科目的成绩;- 对学生成绩进行管理,包括查看某个学生的成绩、某个科目的平均成绩、班级总体平均成绩等。 2. 设计思路 本系统的设计思路为…

    C 2023年5月30日
    00
  • C全局和静态指针

    C语言中指针是一种强大的数据类型,它可以直接访问内存中的数据,极大地提高了程序的灵活性和效率。其中全局指针和静态指针是指针的两种不同的声明方式。 全局指针 全局变量指的是定义在函数之外的变量,它的作用域从整个程序开始到整个程序结束,具有全局性。全局指针也是定义在函数之外的指针变量。 在使用全局指针时,需要注意以下几点: 全局指针变量必须初始化(可以在定义时进…

    C 2023年5月9日
    00
  • C语言实现简单五子棋小游戏

    C语言实现简单五子棋小游戏 本文将详细讲解如何使用C语言实现简单的五子棋小游戏。我们将涵盖以下内容: 程序架构–逻辑部分和界面部分 游戏规则–双方玩家如何落子 代码实现–包括棋盘绘制、棋子判定、游戏结果输出等功能 1. 程序架构 五子棋小游戏的程序一般分为两个部分,逻辑部分和界面部分。逻辑部分处理游戏规则,包括落子,判断输赢等。界面部分负责与用户交互,…

    C 2023年5月23日
    00
  • C++ win系统如何用MinGW编译Boost库

    C++ Win系统如何用MinGW编译Boost库 Boost库是一个开源的、高质量的库,包括许多各种各样的工具和库,被广泛应用于C++编程中。MinGW是一个基于GNU编译器的Windows程序开发工具包,提供了一个完整的开发环境,可用于开发Windows应用程序。本攻略介绍如何使用MinGW编译Boost库。 准备工作 1.下载和安装MinGW可以从Mi…

    C 2023年5月23日
    00
  • C++ 内存分配处理函数set_new_handler的使用

    当C++程序在运行时发现内存分配失败时,会抛出一个std::bad_alloc异常。为了避免程序崩溃,我们可以使用set_new_handler函数来注册一个新的处理函数,当内存分配失败时,程序会调用该函数来处理内存分配失败的情况。 set_new_handler函数的语法 set_new_handler函数是一个全局函数,它的原型如下: std::new_…

    C 2023年5月23日
    00
  • C 位域

    下面我来详细讲解一下 “C 位域” 的使用攻略。 什么是 C 位域? C 位域(Bit Fields)是一种 C 语言中的结构体成员,它可以用来将一个内存单元中的多个位段来表示一个值。可以在结构定义中的成员后面加上冒号和一个数字,这个数字就表示这个成员要占用的位数。 C 位域的使用方法 C 位域的定义方法和普通的结构体成员一样,只是在成员后面加上冒号 “:”…

    C 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部