c - libevent 是否同时处理两个事件,这意味着我需要互斥锁?

标签 c libevent

我正在试验 libevent 库。我定义了一些事件,但没有在代码中创建任何线程。

我的问题是,如果几个事件可以访问/修改相同的共享结构,我是否需要一个互斥锁来锁定关键部分以避免竞争条件?或者libevent的设计方式是事件只能连续执行,而不能同时执行?

注释:

  1. 但当然问题只是关于我的事件本身不产生新线程的情况
  2. 我的担忧主要来 self 使用 JavaScript 的经验:JavaScript 也使用事件循环设计,但即使只有一个线程,我们仍然可能损坏数据。原因是,据我了解,JavaScript 可以“暂停”一个事件的执行并启动第二个事件,然后恢复暂停的事件。如果暂停恰好发生在修改共享对象的行之间,则可能会损坏我的对象。
  3. RTFM 已经存在,但没有找到我正在寻找的明确答案

最佳答案

Libevent 默认设计为单线程。它提供了一种异步事件通知机制,这意味着它以非阻塞、事件驱动的方式处理事件。如果您有多个事件可能会修改相同的数据结构,并且您自己没有创建任何线程,则通常不需要使用互斥体来避免竞争条件,因为这些事件不会同时执行,而是一个接一个地执行.

但是,重要的是要注意 libevent 确实支持多线程模式,其中可以创建多个线程并同时处理事件。如果您要使用此模式,则在访问共享数据时确实需要确保正确的同步(例如使用互斥体)以避免竞争条件。

为了进一步澄清,在单线程事件驱动模型(如 libevent 中的默认模式)中,有一个事件循环,按照事件触发的顺序一次处理一个事件。当事件处理程序正在运行时,无法处理其他事件。这可以有效地防止竞争情况,而无需额外的同步。

请记住,只要您的事件本身不产生新线程并且您在默认的单线程模式下使用 libevent,这一点就成立。如果您的应用程序或库配置为使用多个线程,那么您需要确保正确的同步。

关于c - libevent 是否同时处理两个事件,这意味着我需要互斥锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76361184/

相关文章:

c - 在用户输入的字符串中查找子字符串

c++ - 使用 libevent 回调成员函数

linux - 使用 ./configure 命令安装程序时如何包含头文件

c - 试图解决C程序中的段错误

c - 标题/包含守卫不起作用?

c - 如何在不知道其名称的情况下获取 JobObject 的句柄?

c - 使用 Windows SEH 和 GCC 标签即值跳转到本地错误处理程序

c++ - 如何在使用 bufferevents 写入 libevent 后关闭套接字?

在centos6上编译tor。 libevent 的问题

php - 使用 ZeroMQ 不等待服务器响应