我正在试验 libevent 库。我定义了一些事件,但没有在代码中创建任何线程。
我的问题是,如果几个事件可以访问/修改相同的共享结构,我是否需要一个互斥锁来锁定关键部分以避免竞争条件?或者libevent的设计方式是事件只能连续执行,而不能同时执行?
注释:
- 但当然问题只是关于我的事件本身不产生新线程的情况
- 我的担忧主要来 self 使用 JavaScript 的经验:JavaScript 也使用事件循环设计,但即使只有一个线程,我们仍然可能损坏数据。原因是,据我了解,JavaScript 可以“暂停”一个事件的执行并启动第二个事件,然后恢复暂停的事件。如果暂停恰好发生在修改共享对象的行之间,则可能会损坏我的对象。
- RTFM 已经存在,但没有找到我正在寻找的明确答案
最佳答案
Libevent 默认设计为单线程。它提供了一种异步事件通知机制,这意味着它以非阻塞、事件驱动的方式处理事件。如果您有多个事件可能会修改相同的数据结构,并且您自己没有创建任何线程,则通常不需要使用互斥体来避免竞争条件,因为这些事件不会同时执行,而是一个接一个地执行.
但是,重要的是要注意 libevent 确实支持多线程模式,其中可以创建多个线程并同时处理事件。如果您要使用此模式,则在访问共享数据时确实需要确保正确的同步(例如使用互斥体)以避免竞争条件。
为了进一步澄清,在单线程事件驱动模型(如 libevent 中的默认模式)中,有一个事件循环,按照事件触发的顺序一次处理一个事件。当事件处理程序正在运行时,无法处理其他事件。这可以有效地防止竞争情况,而无需额外的同步。
请记住,只要您的事件本身不产生新线程并且您在默认的单线程模式下使用 libevent,这一点就成立。如果您的应用程序或库配置为使用多个线程,那么您需要确保正确的同步。
关于c - libevent 是否同时处理两个事件,这意味着我需要互斥锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76361184/