Multithreading 编码分配伪码

Multithreading 编码分配伪码,multithreading,concurrency,Multithreading,Concurrency,这里是一个开放式问题,如果一个事件只触发一次,并且多个线程可以注册回调,所有回调都将在事件发生后触发,请注意,在事件发生后尝试注册的回调必须立即触发。如何防止竞争条件/正确调用所有回调。你们觉得怎么样 Register(func){ if(flag == true){ call func; } mutex lock push the callbacks in queue mutex un_lock } even_fired(){ mutex

这里是一个开放式问题,如果一个事件只触发一次,并且多个线程可以注册回调,所有回调都将在事件发生后触发,请注意,在事件发生后尝试注册的回调必须立即触发。如何防止竞争条件/正确调用所有回调。你们觉得怎么样

Register(func){

  if(flag == true){
       call func;
  }

  mutex lock

  push  the callbacks in queue

  mutex un_lock

}

even_fired(){

   mutex lock

   execute the function in the queue
   notify flag
   mutex un_lock
}

可能成为:

   load flag, %r0
   cmp  $0, %r0
   je   1f

因此,事件_fired()可能发生在load和cmp指令之间,这也会导致回调丢失。在面向应用程序的语言中,这种差异变得更大。您需要明确删除与所使用语言相关的竞争条件。

您所说的“只触发一次”到底是什么意思?每次运行软件一次?每次环境重置一次?一次,绝对是吗?该事件何时被视为已消耗?考虑触发的事件,所有已注册的函数都已被调用。然后几年后(或者说估计正常运行时间的90%,不管是什么),一个新函数被注册。应该调用它吗?嗨,Yunnosch,1]它曾经是绝对有史以来的2]事件在触发时被消耗我假设某个变量被设置为指示事件发生时。3] 是的,新函数也必须在几年后调用。因此,如果系统在几年后关闭并再次打开,您仍然希望收到的事件存在,并且为其注册的任何函数都将立即执行。为此,您需要非易失性存储器来存储事件发生的事实,例如,删除电池并重新安装一个新的电池。如果事件对新注册的功能仍然有效,我就不认为它被消耗掉了。但我认为这是一个观点问题……我试图用这种吹毛求疵来说明的是,你需要提供更多的上下文信息。也许现在是时候退后一步,考虑一下这是否可能是一个问题。
if (flag == true) {
   load flag, %r0
   cmp  $0, %r0
   je   1f