C 并发性:如何处理同时在两个不同内核上的两个线程中运行的单个函数(一组指令)?

C 并发性:如何处理同时在两个不同内核上的两个线程中运行的单个函数(一组指令)?,c,linux,multithreading,posix,C,Linux,Multithreading,Posix,假设有一个函数(一组指令foo())可以处理一些数据(全局)。每个执行此函数的进程(foo())生成两个线程。 当这两个线程在两个不同的处理器内核上同时执行时,如何处理并发性和数据保护(竞争条件) 对于并发和数据保护,单核和多核处理器在上述情况下的主要区别是什么?这是一个非常广泛的问题。有不同的技术来解决这个问题。从用户的角度来看,最基本的想法是获取全局数据的锁(例如:POSIX中的mutex),执行一些更新并释放锁。即使您获得了锁,在读取相同数据的其他线程中也可能存在不一致的问题(请参阅)。因

假设有一个函数(一组指令foo())可以处理一些数据(全局)。每个执行此函数的进程(foo())生成两个线程。 当这两个线程在两个不同的处理器内核上同时执行时,如何处理并发性和数据保护(竞争条件)


对于并发和数据保护,单核和多核处理器在上述情况下的主要区别是什么?

这是一个非常广泛的问题。有不同的技术来解决这个问题。从用户的角度来看,最基本的想法是获取全局数据的锁(例如:POSIX中的
mutex
),执行一些更新并释放锁。即使您获得了锁,在读取相同数据的其他线程中也可能存在不一致的问题(请参阅)。因此,您必须访问读锁(请参阅)。这是处理并发性的基本思想


目前,多核系统或单核线程的并发性和数据保护是相似的,因为所有核都可以看到所有内存(本地缓存除外)。如果实现了正确的锁定机制,那么操作系统将负责缓存一致性。基本上,从用户的角度来看,单核线程和多核线程是相同的。

在用户模式设置中,多核多处理有点像最坏情况下的单核多处理。有许多方法可以处理并发性。其中一个正在使用C11。在POSIX上,这两种情况的主要区别在于缓存。但是,如果您采取了所有正确的内存保护预防措施,并且在所有正确的位置使用了互斥锁,那么您可能会期望实现能够确保使用内存屏障和缓存刷新。这个问题太宽泛了。我从“Unix网络编程,第1卷:套接字网络API(第3版)”中学到了关于用C编写线程程序的大部分知识。