我正在阅读《 Unix环境下的高级编程》一书中的Thread Synchronization
。
In this section,有一个示例可以将互斥体与动态分配的对象一起使用。我也有同样的疑问。
在这里,我分享了一个事件时间表(从上到下),以解释我的疑问:
ds
。线程1需要使用ds
进行大量工作,即线程1将长时间获取此锁。 mutex_t
变量获取锁,然后再增加计数。 mutex_t
变量的锁定,所以当Thread2在递增计数之前调用lock()
时,它将不得不等到Thread1解锁该锁定。 怀疑:
foo_rele()
以再次锁定并减少计数。现在有可能在Thread2递增计数之前,Thread1递减计数。如果是(根据我),那么我的数据结构将被破坏?因此,我认为这本书的示例存在一些错误。如果我们使用不同的mutex_var来增加计数会更好吗? 最佳答案
答:我认为在术语“全局列表”下,作者理解线程之间共享的所有变量。
例子:
struct foo* shared_foo; /* This pointer is shared between all threads */
struct foo* foo_alloc(void)
{
/* This pointer is local to the thread which allocates the memory */
struct foo *fp;
if ((fp = malloc(sizeof(struct foo))) != NULL) {
/* whatever */
}
/* local pointer value returned */
return(fp);
}
/* probably somewhere in the code the shared pointer (on the 'global list') is initialized this way */
shared_foo = foo_alloc();
B.嗯...我真的不理解你说的话。你能把你的情况写成一个 list 吗?我认为
f_count
在初始化过程中被设置为标志“此互斥体正在使用”。因此,当互斥锁释放时,f_count
值设置为1。当Thread1
获取锁时,其值设置为2。当释放锁时,该值重新设置为1。有效的f_count
值是:1(初始化并免费) )和2(已初始化且处于忙碌状态)。为了释放该互斥锁,您只需要在获取时调用两次foo_rele
(f_count
= 2),或在空闲时调用一次(f_count
= 1)。然后f_count
值达到0,并且互斥量被删除。