我对OpenMP中的共享变量有一个非常基本的问题(可能是愚蠢的)。请考虑以下代码:
require "socket"
server = TCPServer.open("127.0.0.1", 2000)
loop {
Thread.start(server.accept) do |nodervcr| # Thread, not thread
msg = nodervcr.gets
# puts(msg)
p msg # use this so see all the invisiable chars
if msg.strip == "codeword" # stip the input
puts("codeword!")
else
puts("not codeword")
end
# Note this part works: it sends the server a message and it displays it
# You would think a simple if then else statement could redirect it according to the imcoming message from the client; which is my issue.
end
}
现在void main()
{
int numthreads;
#pragma omp parallel default(none) shared(numthreads)
{
numthreads = omp_get_num_threads();
printf("%d\n",numthreads);
}
}
的值对于所有线程都是相同的。是否有可能由于各种线程将相同的值写入同一个变量,该值可能会出现乱码/损坏?或者原始数据类型上的此操作是否保证是原子的?
答案 0 :(得分:1)
按照标准,这不安全:
可以使用多个加载或存储指令实现对变量的单个访问,以及 因此,对于对同一变量的其他访问,不保证是原子的。 [...] 如果多个线程在没有同步的情况下写入同一个内存单元,包括由于的情况 如上所述的原子性考虑,然后发生数据竞争。 [...]如果发生数据竞争,则未指定程序的结果。
我强烈建议您阅读1.4.1 Structure of the OpenMP Memory Model。虽然这是最简单的阅读,但它非常具体而且非常清晰。比我在这里描述的要好得多。
OpenMP中共享变量需要考虑两件事:访问的原子性和内存的临时视图。