【发布时间】:2015-04-29 21:21:28
【问题描述】:
如何使用这些功能? 我已全局声明锁定。
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。但他们不是。
如果我完全删除锁,我会得到类似的结果。
【问题讨论】:
-
你能准确描述一下是什么行为让你说它不起作用吗?您收到错误消息吗?你的程序挂了吗?它会产生意外的输出吗?
-
非常抱歉,我忘记了循环。好吧,它根本不会锁定我的应用程序。信号量就像一个魅力,但不是这个自旋锁。
-
什么——你自己在纺纱?只需使用
pthread_spin_lock而不是那个循环。您的代码的预编辑形式是正确的。 -
另外,什么行为让你说它“根本不锁定我的应用程序”?
-
pthread_spin_lock 在获得锁之前不会返回。看起来这就是您试图通过循环 trylock 来实现的目标。