是否有办法使一个原子能C。

我不是在寻找一个便携式的解决方案。(平台找赢,Linux)

有帮助吗?

解决方案

也许。

它完全取决于你如何定义的"原子".

  • 在一个单一的核心,深深地嵌入式的环境中没有一个操作系统的参与通常可以禁用和启用中断。这可以用来使一个功能是原子对中断的处理程序的代码。但是,如果你有一个多主旅,DMA引擎,或其他一些硬件设备,可以编写存的独立,那么即使掩蔽中断可能不会提供一个足够强大能保证在某些情况下。

  • 在一个实时操作系统(实时操作系统)的环境中,操作系统核心通常提供的低级同步的原语,如关键部分。一个关键部分是一块代码行为"基本"原子,至少相对于所有其他关键部分。它通常是基本操作系统的执行情况的其他同步元。

  • 在多核心的环境下,一个低水平的原始称为调节锁往往是可用的。它是用来防止条块代码必须是原子相对于其他用户的同样的调节锁的对象,并通过阻止等待CPU核心在紧循环直到释放锁定(因此名称)。

  • 在许多线程的环境,更加复杂的原语等事件、信号灯互斥和排队提供的线的框架。这些合作与线调度这样线等待发生的事情不运行,直到所有的条件得到满足。这些可以用来使一个功能的行动原子相对于其他线共享同一个同步的对象。

一般规则将是使用最高水平能力提供环境中适合的任务。在最好的情况下,现有的线安全的目的,如一个信息队列可以用来避免需要做什么特别的东西在你的代码。

其他提示

如果你想确保你的功能不会被信号中断,使用sigprocmask()掩盖和揭露的信号,但也有一些信号不能被阻塞(如SIGKILL)和行为阻止某些信号(如SIGSEGV)是不确定的。

详见man sigprocmask

不便携,至少。对于一些系统,你也许可以接近它,做事情像机中断转动,以防止核心从前期先发制人,你的函数。但是,这将是非常困难,尤其是对于非嵌入式系统。

您将需要特定于平台的支持,要做到这一点 - 无论是通过使用特殊的编译器内在的硬件指令,或通过使用操作系统的支持。既不Ç也不C ++具有标准化的同步的东西。

定义你的意思是什么“原子”。你的意思是在这个意义上,没有其他进程或线程调度选择“原子”当你运行你的函数?还是你的意思是,在你的函数引用的任何共享对象不会被任何其他线程同时修改了你的函数运行?

对于前者,你不能真正控制从用户空间。如果你是一个单CPU的机器上,你可以的可能保证通过提高你的进程优先级最高优先级的可能(从用户空间)原子。但即使如此,它不能保证,因为你的调度算法可能仍然允许其他进程运行。这样做的唯一可靠的方法是从操作系统。对于单CPU的机器你会禁止中断。对于多芯机你需要锁定总线,等待将采取关闭其他CPU中运行的所有进程。

这里的问题是:为什么你要保证原子一般情况下,只有你的进程可能正在运行,而不是别人的要求,不应该在用户空间存在。如果你想确保某些数据结构仅由一个线程一次访问,那么你应该使用便携式线程库(如pthread为例),并围出你的函数作为一个重要的部分。

如果用原子你的意思是“在同一时间只有一个线程”,那么你可以只用保护临界段块(在Windows)的功能。在Linux中,我使用一个互斥锁定/解锁,以更多或更少的模拟临界区。

您可能要考虑POSIX信号量,互斥或类似,这可能会在Windows和Linux的工作。

使用例如Cygwin的MinGW的还是它甚至可以编写Linux和Windows之间移植的代码。

更妙的是,你可以建立在Linux上的窗口库: HTTP ://cdtdoug.blogspot.com/2009/05/mingw-cross-for-linux.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top