共享内存如何实现同步问题?

时间:2022-12-24 19:36:08
多个进程采用共享内存进行同步,各进程计算完成一帧后,利用共享内存填写标志位,由总控程序通过共享内存读取各进程标志位,当各进程全部计算完一帧之后,通过共享内存填写总控的标志位,各进程读到总控的标志位为1后,进行下一帧计算,为什么在进行到几千帧甚至上万帧之后,容易出现死锁状态,比如某个进程不能动了。导致其余也不能再推进。

7 个解决方案

#1


为什么不用内核对象同步呢,可以设定等待时间

#2


看看windows多线程编程中的线程同步问题吧

#3


使用命名的同步类对象

#4


因为每个进程运行时间不一样,而且每个进程每帧一开始就需要读取别的进程共享的数据,然后进行自己进程的计算,计算完之后再将需要交互的数据进行共享,由于每个进程运行时间不一致,为了保证在读取别的进程共享的数据同时,别的进程没有更新数据,就必须等待每个进程都计算完之后,才能同时共享数据,相当于这个中间有个小的同步,等所有进程共享完数据之后,才能更新总控的状态变量,开始下一帧的计算。需要两次同步,这里都全部使用共享内存来控制,很容易出错,请问有什么好的办法没有来解决这个同步问题。谢谢 各位高手!

#5


因为每个进程运行时间不一样,而且每个进程每帧一开始就需要读取别的进程共享的数据,然后进行自己进程的计算,计算完之后再将需要交互的数据进行共享,由于每个进程运行时间不一致,为了保证在读取别的进程共享的数据同时,别的进程没有更新数据,就必须等待每个进程都计算完之后,才能同时共享数据,相当于这个中间有个小的同步,等所有进程共享完数据之后,才能更新总控的状态变量,开始下一帧的计算。需要两次同步,这里都全部使用共享内存来控制,很容易出错,请问有什么好的办法没有来解决这个同步问题。谢谢 各位高手!

#6


因为每个进程运行时间不一样,而且每个进程每帧一开始就需要读取别的进程共享的数据,然后进行自己进程的计算,计算完之后再将需要交互的数据进行共享,由于每个进程运行时间不一致,为了保证在读取别的进程共享的数据同时,别的进程没有更新数据,就必须等待每个进程都计算完之后,才能同时共享数据,相当于这个中间有个小的同步,等所有进程共享完数据之后,才能更新总控的状态变量,开始下一帧的计算。需要两次同步,这里都全部使用共享内存来控制,很容易出错,请问有什么好的办法没有来解决这个同步问题。谢谢 各位高手!

#7


你需要多个内核对象,

1、每个工作进程有一个标识帧完成的内核对象,
2、总控进程中还有指令每个工作进程可以继续工作的内核对象
3、实际上还需要一个资源锁,工作进程对共享内存进行读写时必需获得锁。

对于工作进程

loop:等待允许工作事件(WaitForSingleObject)
        等待资源锁
            读入共享数据
            计算
            写入结果
        归还锁
      标识 帧完成 设定标识事件,goto loop

对于总控进程

loop: 等待所有工作线程标识事件(WaitForMulitpleObject)
      给所有 允许工作事件 标识,
      goto loop

     
        



#1


为什么不用内核对象同步呢,可以设定等待时间

#2


看看windows多线程编程中的线程同步问题吧

#3


使用命名的同步类对象

#4


因为每个进程运行时间不一样,而且每个进程每帧一开始就需要读取别的进程共享的数据,然后进行自己进程的计算,计算完之后再将需要交互的数据进行共享,由于每个进程运行时间不一致,为了保证在读取别的进程共享的数据同时,别的进程没有更新数据,就必须等待每个进程都计算完之后,才能同时共享数据,相当于这个中间有个小的同步,等所有进程共享完数据之后,才能更新总控的状态变量,开始下一帧的计算。需要两次同步,这里都全部使用共享内存来控制,很容易出错,请问有什么好的办法没有来解决这个同步问题。谢谢 各位高手!

#5


因为每个进程运行时间不一样,而且每个进程每帧一开始就需要读取别的进程共享的数据,然后进行自己进程的计算,计算完之后再将需要交互的数据进行共享,由于每个进程运行时间不一致,为了保证在读取别的进程共享的数据同时,别的进程没有更新数据,就必须等待每个进程都计算完之后,才能同时共享数据,相当于这个中间有个小的同步,等所有进程共享完数据之后,才能更新总控的状态变量,开始下一帧的计算。需要两次同步,这里都全部使用共享内存来控制,很容易出错,请问有什么好的办法没有来解决这个同步问题。谢谢 各位高手!

#6


因为每个进程运行时间不一样,而且每个进程每帧一开始就需要读取别的进程共享的数据,然后进行自己进程的计算,计算完之后再将需要交互的数据进行共享,由于每个进程运行时间不一致,为了保证在读取别的进程共享的数据同时,别的进程没有更新数据,就必须等待每个进程都计算完之后,才能同时共享数据,相当于这个中间有个小的同步,等所有进程共享完数据之后,才能更新总控的状态变量,开始下一帧的计算。需要两次同步,这里都全部使用共享内存来控制,很容易出错,请问有什么好的办法没有来解决这个同步问题。谢谢 各位高手!

#7


你需要多个内核对象,

1、每个工作进程有一个标识帧完成的内核对象,
2、总控进程中还有指令每个工作进程可以继续工作的内核对象
3、实际上还需要一个资源锁,工作进程对共享内存进行读写时必需获得锁。

对于工作进程

loop:等待允许工作事件(WaitForSingleObject)
        等待资源锁
            读入共享数据
            计算
            写入结果
        归还锁
      标识 帧完成 设定标识事件,goto loop

对于总控进程

loop: 等待所有工作线程标识事件(WaitForMulitpleObject)
      给所有 允许工作事件 标识,
      goto loop