C 阻塞 非阻塞和多线程之间有什么关系?

发布于 科技 2024-02-05
4个回答
  1. 匿名用户2024-01-25

    说到阻塞和非阻塞的概念,让我们了解一下同步和异步的概念。

    同步:多个线程可以同时访问同一资源。 例如,对于变量,线程可以同时读取和写入该变量。

    使用场景:多个线程同时访问一条数据,也称为共享区域。 当多个线程同时访问一条数据时,必须使用同步,否则可能不安全。

    例如,数据库中的脏读取。 但是,有一种情况是多个线程同时访问一段数据,不需要同步技术,那就是原子操作,这意味着操作系统保证操作要么完成,要么根本不完成。

    异步:用例:只有一个线程访问当前数据。 例如,观察者模式,其中没有共享区域,主体发生变化,观察者收到更新通知,主体继续做自己的事情,无需等待观察者更新完成再工作。

    同步分为阻塞 IO 和异步 IO

    异步可分为阻塞 IO 和非阻塞 IO

    异步阻塞 IO 是通过 select 和 epoll 实现的。

  2. 匿名用户2024-01-24

    什么是线程阻塞?

    在某个时间,当一个线程运行了一段**时,另一个线程也需要运行,但是在运行过程中线程的执行完成之前,另一个线程无法获取CPU执行权限(调用sleep方法进入睡眠暂停状态,但CPU执行权限不交出, 调用 wait 方法是将 CPU 执行能力移交给另一个线程),这会导致线程阻塞。

    为什么会发生线程阻塞?

    1.休眠状态:当一个线程执行**时,调用sleep方法后,线程处于休眠状态,需要设置休眠时间,这时有其他线程需要执行时,会导致线程阻塞,调用sleep方法后,线程不会释放锁对象, 也就是说,锁还在线程手里,CPU执行权还在自己手里,一旦休眠时间过去,线程就会进入就绪状态;

    2.等待状态:当一个线程在运行时,调用等待方法,此时线程需要交出CPU执行权限,即释放锁,移交给另一个线程,线程进入等待状态,但与休眠状态不同的是,进入等待状态的线程不需要设置休眠时间, 但需要执行 notify 方法或 notifyAll 方法唤醒它,它不会主动唤醒,被唤醒后线程也会进入 ready 状态,但进入 ready 状态的线程没有执行权,即没有锁,处于休眠状态的线程唤醒,进入 ready 状态时仍持有锁;

    3.礼让状态:当一个线程在运行时,调用 yield 方法后,线程会把执行权限交给同级别的线程或比它高的线程先执行,这时线程可能只执行部分执行,此时执行权对其他线程是礼貌的, 此时也会进入阻塞状态,但线程可能随时被分配执行权限;

    4.关闭状态:当一个线程在运行时,调用一个 join 方法,该线程将进入阻塞状态,另一个线程将运行,而原始线程直到运行结束才会进入就绪状态。

    这更像是“走后门”,你应该先解决你的事,然后再解决你身后的人的事情,但这个时候,如果有人走后门,就不再替你解决,优先解决走后门的人的事情;

    和 resume(),suspend() 是将线程置于阻塞状态,它的解毒剂是 resume(),如果没有 resume(),它不会自行恢复。

  3. 匿名用户2024-01-23

    线程阻塞通常是指在执行 raid 期间暂停以等待触发特定条件的线程。 射银。

  4. 匿名用户2024-01-22

    1. 在多线程处理中阻止对线程的调用的方法。

    线程类的方法。

    join:阻止调用线程,直到线程终止。

    2. 在 C 语言中用于处理线程同步问题。

    通过锁定和解锁指定对象,可以实现对同步段的访问。 在 .net 命名空间中提供了 monitor 类来实现锁定和解锁,该类中的方法为静态。

    enter:获取指定对象的独占锁。

    tryenter:尝试获取指定对象的独占锁。

    exit:解除指定对象的独占锁。

    wait:释放指定对象上的独占锁,并阻塞当前线程,直到它重新获得锁。

    pulse:通知等待队列中的线程锁定对象的状态发生变化。

    pulseall:通知所有等待线程对象状态的更改。

相关回答
15个回答2024-02-05

第一个 awhile(leap) 条件是 leap 是否为 true(如果 leap 不是 0,则为 true,如果为 0,则为 false)。 >>>More

18个回答2024-02-05

此函数用于打开指定文件的预定义流:标准输入、标准输出或标准错误。 >>>More

8个回答2024-02-05

将 struct、student 和 internal 元素定义为 age、num 数组。 >>>More

14个回答2024-02-05

在 VisualStudio 2013 中编写和调试 C 语言程序的步骤: 1.打开 [文件] - 新建 - 项目以打开“新建项目”窗口。2. 在[模板]、[名称]、[位置]和[解决方案名称]中选择[Visual C++] Win32控制台应用程序,可以根据需要填写。 >>>More

14个回答2024-02-05

你能说清楚吗,我不知道你的意思。 是否要在 main 函数中调用一个函数,然后不知道如何定义被调用的函数? 如果是这样的话,我可以告诉你。 >>>More