c - 自旋锁函数的使用

标签 c ipc spinlock

如何使用这些功能? 我已经在全局范围内宣布锁定。

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(),它会启动一个新进程,该进程与父进程不共享相同的地址空间。

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

关于c - 自旋锁函数的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29954818/

相关文章:

子进程在使用父进程将数据写入管道之前读取数据

c++ - 通过函数指针从外部文件调用静态函数的坏习惯?

linux - 如何更改与 stdin 文件描述符关联的 fd?

.net - 是什么提供了自旋锁的有效性?

c - Linux 内核线程与自旋锁卡住

c - 结构数组崩溃程序 C

c - C UNIX 中的分支和管道

macos - 与子进程共享 Mach 端口

linux - 为什么自旋锁在 Linux 内核(非 SMP)中是空操作?

c - 在同一个进程中,同一个文件的多个 MAP_PRIVATE 映射仍然是私有(private)的吗?