gpt4 book ai didi

c - 如何在不阻塞的情况下同步线程?

转载 作者:IT王子 更新时间:2023-10-29 01:21:19 26 4
gpt4 key购买 nike

据我所知,互斥锁用于同步所有共享相同数据的线程,遵循以下原则:当一个线程使用该数据时,所有其他线程在使用该公共(public)资源时应被阻塞,直到它被解锁。 .now 最近在一篇博文中我看到了解释这个概念的代码,有些人写道,在一个线程访问资源时阻塞所有线程是一个非常糟糕的主意,它违背了线程的概念,而线程的概念在某种程度上是正确的.. < strong>那么我的问题是如何在不阻塞的情况下同步线程?

这是该博文的链接

http://www.thegeekstuff.com/2012/05/c-mutex-examples/

最佳答案

根据同步的定义,您不能同步线程而不阻塞。但是,好的同步技术会将阻塞的范围限制在绝对最小值。为了说明并准确指出文章错误的原因,请考虑以下内容:

来自文章:

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;
}

请注意,在文章中,正在完成的工作(无意义的 for 循环)是在持有锁的情况下完成的。这完全是胡说八道,因为工作应该同时完成。需要锁的原因只是为了保护 counter 变量。因此线程只需要在更改该变量时保持锁定,如第二个示例所示。

互斥锁保护代码的临界区,这是一次只有一个线程应该触及的那些代码区域——如果出现以下情况,所有其他线程必须阻塞试图同时访问关键部分。但是,如果线程 1 在临界区而线程 2 不在,那么两者并发运行是完全没问题的。

关于c - 如何在不阻塞的情况下同步线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32612312/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com