线程与进程浅谈

  • 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多
    个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创
    建、运行到消亡的过程。
  • 线程:进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,可以理解为一个进程便相当
    于一个单 CPU 操作系统,而线程便是这个系统中运行的多个任务。
  • 进程与线程的区别
    进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。
    线程:堆空间是共享的,栈空间是独立的,线程消耗的资源比进程小的多。
    注意:
  • 因为一个进程中的多个线程是并发运行的,那么从微观角度看也是有先后顺序的,哪个线程执行完全取决于
    CPU 的调度,程序员是干涉不了的。而这也就造成的多线程的随机性。
  • Java 程序的进程里面至少包含两个线程,主进程也就是 main()方法线程,另外一个是垃圾回收机制线程。每
    当使用 java 命令执行一个类时,实际上都会启动一个 JVM,每一个 JVM 实际上就是在操作系统中启动了一个
    线程,java 本身具备了垃圾的收集机制,所以在 Java 运行时至少会启动两个线程。
  • 由于创建一个线程的开销比创建一个进程的开销小的多,那么我们在开发多任务运行的时候,通常考虑创建
    多线程,而不是创建多进程。
    线程调度:
  • 计算机通常只有一个CPU时,在任意时刻只能执行一条计算机指令,每一个进程只有获得CPU的使用权才能执行指
    令。所谓多进程并发运行,从宏观上看,其实是各个进程轮流获得CPU的使用权,分别执行各自的任务。那么,在可运行
    池中,会有多个线程处于就绪状态等到CPU,JVM就负责了线程的调度。JVM采用的是抢占式调度,没有采用分时调度,
    因此可以能造成多线程执行结果的的随机性。
    创建线程类
    Java使用 java.lang.Thread 类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用是
    完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码。Java使用线程执行体来代表这段程序流。
    Java中通过继承Thread类来创建并启动多线程的步骤如下:
  1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把
    run()方法称为线程执行体。
  2. 创建Thread子类的实例,即创建了线程对象
  3. 调用线程对象的start()方法来启动该线程
    代码如下:
    测试类:
    自定义线程类:

public class Demo01 {
public static void main(String[] args) {
//创建自定义线程对象
MyThread mt = new MyThread(“新的线程!”);
//开启新线程
mt.start();
//在主方法中执行for循环
for (int i = 0; i < 10; i++) {
System.out.println(“main线程!”+i);
}
}
}
public class MyThread extends Thread {
//定义指定线程名称的构造方法
public MyThread(String name) {
//调用父类的String参数的构造方法,指定线程的名称
super(name);
}
/**

  • 重写run方法,完成该线程执行的逻辑
    */
    @Override
    public void run() {
    for (int i = 0; i < 10; i++) {
    System.out.println(getName()+":正在执行!"+i);
    }
    }
    }
<think>我们正在讨论C语言中创建进程线程的方法。根据之前的引用资料,我们知道进程是资源分配的最小单位,而线程是CPU调度的最小单位。在C语言中,我们可以使用系统调用来创建进程(如fork)线程(如pthread库)。 创建进程: 在Unix/Linux系统中,创建进程通常使用fork()系统调用。fork()会创建一个进程几乎完全相同的子进程。子进程从fork()返回的地方开始执行,但fork()在父进程中返回子进程进程ID(PID),在子进程中返回0。 创建线程: 在C语言中,线程创建通常使用POSIX线程库(pthread)。主要函数是pthread_create(),用于创建一个新的线程并执行指定的函数。 接下来,我将分别给出创建进程线程的示例代码,并解释关键步骤。 注意:在编译多线程程序时,需要链接pthread库,例如:gcc program.c -o program -lpthread 下面分别给出两个示例: </think>### C语言创建进程线程的方法 #### 一、进程创建(fork系统调用) 在Unix/Linux系统中,C语言使用`fork()`系统调用创建进程: ```c #include <unistd.h> int main() { pid_t pid = fork(); // 创建进程 if (pid < 0) { // 错误处理 } else if (pid == 0) { // 子进程执行代码 printf("Child PID: %d\n", getpid()); } else { // 父进程执行代码 printf("Parent PID: %d\n", getpid()); } return 0; } ``` **关键特性**: 1. `fork()`创建的子进程是父进程的副本,继承内存、文件描述符等资源 2. 父进程进程执行相同的程序代码 3. 通过返回值区分父子进程: $$ \text{返回值} = \begin{cases} <0 & \text{创建失败} \\ =0 & \text{子进程执行分支} \\ >0 & \text{父进程执行分支(值为子进程PID)} \end{cases} $$ 4. 典型应用场景:Web服务器、Shell命令执行[^2] --- #### 二、线程创建(pthread库) 在POSIX系统中,使用`pthread_create()`函数创建线程: ```c #include <pthread.h> void* thread_func(void* arg) { printf("Thread ID: %lu\n", pthread_self()); return NULL; } int main() { pthread_t tid; int ret = pthread_create(&tid, NULL, thread_func, NULL); if (ret != 0) { // 错误处理 } pthread_join(tid, NULL); // 等待线程结束 return 0; } ``` **关键特性**: 1. 线程共享进程的内存空间文件描述符 2. 需要链接`-lpthread`编译选项 3. 线程同步机制: - 互斥锁(`pthread_mutex_t`)保护共享资源 - 条件变量(`pthread_cond_t`)实现线程协作[^3] 4. 典型应用场景:并发服务器、GUI事件处理 --- #### 三、进程 vs 线程对比 | 特性 | 进程 | 线程 | |------|------|------| | **创建开销** | 高(复制资源) | 低(共享资源) | | **通信方式** | IPC(管道/共享内存) | 共享内存 | | **隔离性** | 强(独立地址空间) | 弱(共享地址空间) | | **调试难度** | 相对简单 | 较复杂(竞态条件) | | **资源分配** | 操作系统分配 | 进程内部分配[^4] | --- #### 四、综合应用示例 实现生产者-消费者模型: ```c #include <pthread.h> #define BUFFER_SIZE 10 int buffer[BUFFER_SIZE]; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond_full = PTHREAD_COND_INITIALIZER; pthread_cond_t cond_empty = PTHREAD_COND_INITIALIZER; void* producer(void* arg) { for(int i=0; ; i++) { pthread_mutex_lock(&mutex); while(/* 缓冲区满 */) pthread_cond_wait(&cond_empty, &mutex); // 生产数据到缓冲区 pthread_cond_signal(&cond_full); pthread_mutex_unlock(&mutex); } return NULL; } // 类似实现consumer函数 ``` --- ### 相关问题 1. 进程间通信(IPC)有哪些常用方法? 2. 如何避免多线程编程中的死锁问题? 3. pthread_join()pthread_detach()有何区别? 4. 守护进程(daemon)的创建步骤是什么? 5. 为什么多线程程序需要同步机制? [^1]: Linux学习之C语言的进程线程编程 [^2]: C语言的进程 [^3]: C语言线程 [^4]: 浅谈进程线程创建过程以及小细节
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值