OpenMP中的共享变量

时间:2017-07-22 10:25:38

标签: multithreading openmp shared-memory

我对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); } } 的值对于所有线程都是相同的。是否有可能由于各种线程将相同的值写入同一个变量,该值可能会出现乱码/损坏?或者原始数据类型上的此操作是否保证是原子的?

1 个答案:

答案 0 :(得分:1)

按照标准,这不安全:

  

可以使用多个加载或存储指令实现对变量的单个访问,以及   因此,对于对同一变量的其他访问,不保证是原子的。   [...]   如果多个线程在没有同步的情况下写入同一个内存单元,包括由于的情况   如上所述的原子性考虑,然后发生数据竞争。 [...]如果发生数据竞争,则未指定程序的结果

我强烈建议您阅读1.4.1 Structure of the OpenMP Memory Model。虽然这是最简单的阅读,但它非常具体而且非常清晰。比我在这里描述的要好得多。

OpenMP中共享变量需要考虑两件事:访问的原子性内存的临时视图