Pthreads 关于pthread互斥体的使用

Pthreads 关于pthread互斥体的使用,pthreads,mutex,Pthreads,Mutex,这个用法正确吗 这项工作将按以下方式进行: 假设i可以是1或2,j是一个全局常数。 线程-A,其中i=1调用此函数并获取互斥体sharesvar_mutex[1]并修改 sharedvar[1][j]。 线程B,其中i=1,当它进入函数时,将在互斥锁上等待 i=2的thread-C可以输入并获取互斥体sharesvar_mutex[2]并修改sharedvar[2][j] 这样行吗 谢谢 是的,它会那样工作 你可能需要考虑的一件事。看起来您正在使用互斥量数组来防止对给定i同时执行getvalue

这个用法正确吗

这项工作将按以下方式进行: 假设i可以是1或2,j是一个全局常数。 线程-A,其中i=1调用此函数并获取互斥体sharesvar_mutex[1]并修改 sharedvar[1][j]。 线程B,其中i=1,当它进入函数时,将在互斥锁上等待

i=2的thread-C可以输入并获取互斥体sharesvar_mutex[2]并修改sharedvar[2][j]

这样行吗


谢谢

是的,它会那样工作


你可能需要考虑的一件事。看起来您正在使用互斥量数组来防止对给定i同时执行getvalue函数,并防止在分配给sharedvar[]时出现争用条件。如果您希望防止对给定的i同时执行getvalue,这可能是很好的。然而,与原子操作相比,在数组中设置整数时使用mutext仅仅是为了防止竞争条件是过分的

这完全取决于您如何声明
sharedvar
。如果它是指向不同的、单独分配的对象的指针数组,那么这很好。如果它是单个数组,那么一个线程正在访问一个对象,而另一个线程可能正在修改它;当另一个线程正在修改/读取sharedvar[2][j]时,该线程应该能够修改[/read]sharedvar[1][j],但不应该能够读取[/modify]sharedvar[1][j]。这在技术上是不合法的。如果将
sharedvar
声明为单个数组,则它是单个对象。一个线程无法访问对象,而另一个线程可能正在修改它。如果你做了
uint32*sharedvar[2];sharedvar[0]=malloc(…)sharedvar
本身将是一个对象,但之后您不会修改它。所以这没关系。)在实践中,代码可能会工作,但性能会很差,因为@david我100%不同意这种说法:“如果将sharedvar声明为单个数组,则它是单个对象。一个线程无法访问对象,而另一个线程可能正在修改它。“一个线程访问数组的一个元素,另一个线程访问另一个元素是完全安全的。此外,当线程访问同一缓存线上的两个对象时,可能会发生“错误共享”。它们是否是独立的对象并不重要。您所能说的是,与其他安排相比,您可能更容易获得与UINT数组的错误共享。@johnnycrash:“一个线程访问数组中的一个元素,另一个线程访问另一个元素是完全安全的。”真的吗?如果我有
charj[4]并且平台没有单字节读写操作?
uint32 abc(int i)
{
    pthread_mutex_lock(&sharedvar_mutex[i]);

    sharedvar[i][j] = getvalue(i,j);

    pthread_mutex_unlock(&sharedvar_mutex[i]);
}