的链接。但是,良好的同步技术会将事物被阻塞的范围限制在绝对最小值。为了说明这一点,并指出正是为什么文章是错误的考虑以下几点:
从文章:
pthread_t tid[2];
int counter;
pthread_mutex_t lock;
void* doSomeThing(void *arg)
{
pthread_mutex_lock(&lock);
unsigned long i = 0;
counter += 1;
printf("\n Job %d started\n", counter);
for(i=0; i<(0xFFFFFFFF);i++);
printf("\n Job %d finished\n", counter);
pthread_mutex_unlock(&lock);
return NULL;
}
它应该是什么:
pthread_t tid[2];
int counter;
pthread_mutex_t lock;
void* doSomeThing(void *arg)
{
unsigned long i = 0;
pthread_mutex_lock(&lock);
counter += 1;
int myJobNumber = counter;
pthread_mutex_unlock(&lock);
printf("\n Job %d started\n", myJobNumber);
for(i=0; i<(0xFFFFFFFF);i++);
printf("\n Job %d finished\n", myJobNumber);
return NULL;
}
注意的是,在文章中,正在完成的工作(毫无意义的循环)是在按住锁的情况下完成的。这完全是无稽之谈,因为这项工作应该同时完成。需要锁的原因只是为了保护counter
变量。因此,线程只需在第二个示例中更改该变量时保持锁定。如果试图在同一访问临界区和所有其他线程必须块 -
互斥锁保护关键部分的代码,这是只有1在时间线应该触及这些代码领域时间。但是,如果线程1位于临界区域,而线程2不在,那么两者同时运行就完全正常了。
Mutexes不会阻塞所有线程;它们只会阻塞尝试获取互斥锁的线程。 –
这就是我的意思... –
反思你的应用程序的设计? – alk