自旋锁函数的使用

Usage of spinlock functions

如何使用这些功能? 我已经全局声明锁定。

pthread_spinlock_t lock;

自旋锁也在本地初始化。

pthread_spin_init(&lock, 1); // non-zero as pshared for IPC

但现在我想锁定我的临界整数并递增它。 我有多个进程 运行 这在一个循环中:

while(0 != pthread_spin_trylock(&lock));
criticalInt += 1;
pthread_spin_unlock(&lock);

为什么那行不通? 还有,下面这个函数是怎么用的?

pthread_spin_lock(&lock);

编辑:

for (i=0; i < NUM_CHILDREN; i++) {

   pid[i] = fork();
   if (pid[i] == -1) { return EXIT_FAILURE; }
   if (pid[i] == 0) {
   while (criticalInt < MAXCOUNT) {
      pthread_spin_lock(&lock);
      criticalInt += 1;
      pthread_spin_unlock(&lock);
      count++;
   }
   printf("Process %i counted %i\n", i, count);

}

对于 1000000 的 MAXCOUNT,帽子会产生以下输出:

    Process 3 counted 687858
    Process 0 counted 815657
    Process 1 counted 640191
    Process 2 counted 744340

其实加起来应该是1000000,其实不是。

如果我完全删除锁,我会得到类似的结果。

要使 POSIX 线程正常工作,您需要使用 pthread_create() 启动新线程。在这里,您使用的是 fork(),它启动了一个新进程,该进程与父进程不共享相同的地址 space。

更新:@Ramiz 在评论中指出,一些 pthread 原语可以利用允许它们跨分支进程运行的共享内存区域。这不是使用 pthread 东西的常见方式,但它是可能的!

如果你想让自旋锁被多个进程使用而不是线程那么自旋锁本身也需要在shared中生成进程内存。 PTHREAD_PROCESS_SHARED 的 pshared 值本身不足以让自旋锁在进程之间共享。