我知道从OpenMP中的共享变量读取不会导致竞争条件,因为每个线程都有自己的变量副本。 但是如果共享变量是一个指针(例如,一个容器),那么每个线程只获得一个指针的副本。
如果我现在从指针指向的位置(我的容器)读取,是否有种族条件或OpenMP以某种方式处理这个问题?
在线程中共享容器本身的副本而不是指向它的指针是否更好?
答案 0 :(得分:1)
只是从变量中读取不会产生竞争条件:变量是否共享并不重要。要产生竞争条件,您需要有两个或更多线程尝试同时修改变量的同一个实例。
然后,假设您的线程正在读取并修改某个变量,如果您将此变量设置为共享,则由于所有线程共享同一个实例,因此您仍然会遇到竞争条件。我想在你的第一段你想说私人,就像@ilotXXI指出的那样。
关于你关于私有化指针的问题,如果该指针的另外两个实例指向相同的数据并且他们修改它,你将有一个竞争条件(每个线程都有一个私有版本的指针但不是私有版本数据)。
请注意,从一个数据共享条款更改为另一个条目可能会更改应用程序的行为。因此,通常,在并行化应用程序时,首先要做的是分析应用程序正在执行哪种数据访问。一旦你知道了,你必须考虑应该使用哪些数据共享子句和哪些同步结构(如果需要)来保持应用程序的原始行为。