进程和线程相关知识

1、线程和进程的区别:

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。

在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)

内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

2、

std::mutex mtx; //定义互斥锁对象

std::condition_variable cv;//条件信号量

std::thread thread1 = std::thread([参数:如this] 

{  

        std::unique_lock<std::mutex> lock(mtx); //通过给lock对象传入互斥锁对象mtx来实现mtx锁对象的占有,从而获取当前线程的执行权。更好

        或者通过mtx.lock()方式占有锁。

        cv.wait(lock, [this] { return is_ready; }); //条件信号量

}//线程函数

);

cv.notify_one();//调用cv.notify_one()时会查看cv fifo中的第一个线程的wait条件是否满足,如果满足,则执行,并通过mtx互斥锁锁定需要资源;不满足则继续等待下一次cv.notify_one();

std::condition_variable 是 C++11 标准库提供的一种线程同步原语,用于实现线程间的条件通知和等待。它通常与 std::mutex 一起使用,用来保护共享资源,确保在多线程环境中的安全访问。

this指针是指向对象自己的指针,即有了对象才有this指针。不能在线程函数中直接使用this指针, 因为线程函数中根本就没有这个东西,所以需要传进去,然后进行类型转换。

if (module_thread.joinable()) module_thread.join();方法结束module_thread。

3、在多线程编程中,通过线程调用函数和直接调用函数之间有几个关键的区别:

  1. 并发执行

    • 线程调用函数:通过线程调用函数时,函数会在新的线程中执行,与主线程(或其他线程)的执行是并发的。这意味着函数可能会与其他线程中的代码交替执行,具体执行顺序取决于操作系统的调度和线程的优先级设置。
    • 直接调用函数:直接调用函数时,函数会在当前线程中顺序执行,直到函数返回或者遇到阻塞操作为止。
  2. 上下文和资源隔离

    • 线程调用函数:在新线程中执行函数时,它拥有独立的执行上下文和资源,例如栈空间。这意味着函数执行期间可以并行运行,互不影响地访问数据和资源。
    • 直接调用函数:直接调用函数时,函数与调用者共享同一线程上下文和资源。这可能导致数据竞争和其他线程安全问题,除非在函数内部进行了显式的同步和互斥操作。
  3. 通信与同步

    • 线程调用函数:通常需要通过消息传递、共享内存或同步机制(如互斥锁、条件变量等)进行线程间通信和同步。例如,一个线程调用完函数后可能需要等待另一个线程处理完特定任务。
    • 直接调用函数:函数的调用者和被调用者可以直接共享内存和变量,因此可以更直接地进行数据传递和共享。
  4. 线程管理

    • 线程调用函数需要考虑线程的创建、启动、管理和销毁过程,这可能涉及到线程的生命周期管理、资源释放等复杂问题。
    • 直接调用函数:不涉及额外的线程管理开销和复杂性,函数调用完成后,控制权立即返回给调用者。

综上所述,使用线程调用函数和直接调用函数之间的选择取决于具体的需求和情境。多线程适用于需要并发执行、资源隔离、异步处理和复杂同步逻辑的情况,而直接调用函数则适用于简单的顺序执行和共享资源的场景。

4、进程通信方式:共享内存、fifo、socket、管道、消息队列和信号。

5、sleep()会释放线程资源,但是不会释放锁资源,如果其他线程也需要这个锁资源,则会等待,不需要则可以执行。wait()会释放线程和锁资源,通过notify()重新获取获取线程资源。

6、互斥锁:获取锁资源失败时,切换到其他线程执行。

      自旋锁:获取锁资源失败时,占用资源忙等待,直到锁释放。

       读写锁:可以把读锁同时分配给多个读线程,只对写线程进行锁互斥。

        乐观锁:先操作,后上锁,如果有冲突,再解决冲突。

        悲观锁:先上锁,后操作。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程线程是操作系统中的两个重要概念,用于管理和执行程序的执行。 1. 进程(Process): - 进程是计算机中正在运行的程序的实例。它由程序、数据集合、执行状态等组成。 - 每个进程都有自己的地址空间和系统资源,如打开的文件、网络连接等。 - 进程是独立运行的,拥有自己的执行流程,可以并行执行。 - 进程之间通过进程间通信(IPC)机制进行交互,如管道、共享内存、消息队列等。 2. 线程(Thread): - 线程是进程中的一个执行单元,一个进程可以包含多个线程。 - 线程共享进程的资源,如地址空间、文件描述符等。 - 线程之间可以并发执行,共享进程的上下文和数据。 - 线程之间可以通过共享内存等机制进行通信。 进程线程之间的区别: 1. 资源开销:创建和撤销进程的开销较大,包括分配内存空间、建立上下文等;而创建和撤销线程的开销较小,因为它们共享进程的资源。 2. 独立性:进程是独立运行的实体,互相之间不会影响;而线程是在进程内部的执行流,共享进程的资源,彼此之间有较强的依赖关系。 3. 切换速度:由于线程共享进程的上下文,线程的切换速度较快;而进程切换需要保存和恢复更多的上下文信息,速度较慢。 4. 通信和同步:进程间通信需要额外的机制,如管道、消息队列等;而线程之间可以直接共享内存,更容易进行通信和同步。 进程线程的使用场景: - 进程适合用于独立运行、互不干扰的任务,如操作系统中的各个应用程序。 - 线程适合用于执行共享资源、并发执行的任务,如多线程的网络服务器、图形界面程序等。 总结:进程线程是操作系统中用于管理和执行程序的重要概念。进程是程序的实例,拥有独立的资源和执行流程,通过进程间通信进行交互。线程是进程中的执行单元,共享进程的资源,可以并发执行,通过共享内存等机制进行通信。进程线程各有优势和适用场景,根据具体需求选择合适的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值