[Openmp-commits] [PATCH] D121058: [OpenMP][FIX] Avoid races in the handling of to be deleted mapping entries

Shilei Tian via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Sat Mar 5 14:23:46 PST 2022


tianshilei1992 added inline comments.


================
Comment at: openmp/libomptarget/src/device.cpp:386
+      // simply skip the deletion step then.
+      HT.setDeleteThreadId(__kmpc_global_thread_num(NULL));
+      HT.decRefCount(UseHoldRefCount);
----------------
Unfortunately, `__kmpc_global_thread_num` cannot give you a unique id. I did a simple test:
```
#include <cstdint>
#include <cstdio>
#include <thread>
#include <vector>

extern "C" int32_t __kmpc_global_thread_num(void *);

void foo() {
  std::chrono::seconds timespan(1);
  std::this_thread::sleep_for(timespan);
  int gtid = __kmpc_global_thread_num(nullptr);
  printf("gtid = %d.\n", gtid);
}

int main(int argc, char *argv[]) {
  std::vector<std::thread> pool(8);
  for (int i = 0; i < 8; ++i) {
    pool[i] = std::thread(foo);
  }

  for (std::thread &t : pool) {
    if (t.joinable()) {
      t.join();
    }
  }

  return 0;
}
```
It prints:
```
gtid = 0.
gtid = 9.
gtid = 10.
gtid = 9.
gtid = 10.
gtid = 9.
gtid = 10.
gtid = 9.
```
Since `libomptarget` is not forced to use OpenMP thread, we cannot use functions in `libomp` to tell thread id. `std::thread::id` should be used here I think.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D121058/new/

https://reviews.llvm.org/D121058



More information about the Openmp-commits mailing list