如何使用这些功能? 我已经在全局范围内宣布锁定。
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/