【发布时间】:2011-03-03 23:17:24
【问题描述】:
我遇到了互斥锁的问题(Linux 上的 pthread_mutex),如果一个线程在解锁后立即再次锁定互斥锁,另一个线程不是很成功地获得锁。我附上了创建一个互斥锁的测试代码,以及两个线程,它们在无限循环中锁定互斥锁,休眠一段时间并再次解锁。
我希望看到的输出是来自两个线程的“活动”消息,每个线程一个(例如 121212121212。但是我得到的是一个线程获得了大多数锁(例如 111111222222222111111111 或只是 1111111111111...)。
如果我在解锁后添加一个 usleep(1),一切都会按预期工作。显然,当线程进入 SLEEP 时,另一个线程获得了它的锁——但这不是我所期望的方式,因为另一个线程已经调用了 pthread_mutex_lock。我怀疑这是实现的方式,因为动作线程具有优先级,但是它在这个特定的测试用例中会导致某些问题。有什么方法可以防止它(除了故意添加足够大的延迟或某种信号)或者我的理解错误在哪里?
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
pthread_mutex_t mutex;
void* threadFunction(void *id) {
int count=0;
while(true) {
pthread_mutex_lock(&mutex);
usleep(50*1000);
pthread_mutex_unlock(&mutex);
// usleep(1);
++count;
if (count % 10 == 0) {
printf("Thread %d alive\n", *(int*)id);
count = 0;
}
}
return 0;
}
int main() {
// create one mutex
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutex_init(&mutex, &attr);
// create two threads
pthread_t thread1;
pthread_t thread2;
pthread_attr_t attributes;
pthread_attr_init(&attributes);
int id1 = 1, id2 = 2;
pthread_create(&thread1, &attributes, &threadFunction, &id1);
pthread_create(&thread2, &attributes, &threadFunction, &id2);
pthread_attr_destroy(&attributes);
sleep(1000);
return 0;
}
【问题讨论】: