- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一项任务需要在何处进行一些线程管理。问题是我只被允许使用一个互斥量,仅此而已,没有更多的条件或其他任何东西。
我有一个结构,其中包含一些数据,其中有 2 个线程更改和一个互斥体。该结构排列在一个数组中,并通过索引访问。
编辑:我认为这是一个更好的解释。问题是我遇到了死锁,因为 thread2 仍然持有锁而 thread1 想要获取它,或者有时相反。
typedef struct {
int number;
pthread_mutex_t mutex;
} data;
data myStruct[100];
void* thread1()
{
pthread_mutex_lock(&myStruct[index].mutex)
// get 1 index value
// access the struct via index
// change a value
pthread_mutex_unlock(&myStruct[index].mutex)
}
void* thread2()
{
pthread_mutex_lock(&myStruct[index1].mutex)
pthread_mutex_lock(&myStruct[index2].mutex)
// get 2 index values
// access struct with both indexes
// change values with both indexes
pthread_mutex_unlock(&myStruct[index2].mutex)
pthread_mutex_unlock(&myStruct[index1].mutex)
}
指数值是通过一些随机计算得到的。 Mutex 的初始化和销毁,以及线程的创建都不在我手中。
我有 2 个线程。两个线程都可以访问其中的结构和互斥量。并且必须使用这个互斥锁来锁定和解锁数据。线程 1 仅更改一个数据结构中的数据,线程 2 更改两个数据结构中的数据。
问题是我必须在两个线程中等待互斥锁,目前我通过
解决了它while(pthread_mutex_lock(&struct[i].lock) != 0)
它有时会起作用,但我不知道我应该如何只用这个互斥锁来锁定。我不允许创建更多的互斥量、信号量或条件。
您有什么想法可以尝试吗?
最佳答案
您的代码似乎有可能出现死锁。如果 thread1
函数获取第一个互斥锁,而 thread2
函数获取第二个互斥锁,则所有资源都可能被捆绑和锁定。我认为你应该尝试类似的方法,
...
pthread_mutex_lock(&mutex_1);
while ( pthread_mutex_trylock(&mutex_2) ) /* Test if already locked */
{
pthread_mutex_unlock(&mutex_1); /* Free resource to avoid deadlock */
...
/* stall here */
...
pthread_mutex_lock(&mutex_1);
}
// count++; or yadda yadda yadda
pthread_mutex_unlock(&mutex_1);
pthread_mutex_unlock(&mutex_2);
...
关于c - 无条件等待互斥体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44202354/
我想编写一个 SQL 查询,如果没有分配日期时间,我想替换一个可以选择所有日期和时间的字符串。 实际工作原理: SELECT * FROM `entry` WHERE `user` like
表格如下所示: | colA | colB | colC | colD |some other cols ----------------------------- |double|double| i
我有一个 C# 程序经常失败。没关系,我已经创建了程序,它是我的 child ,无论如何我都喜欢它。作为一种支持,我决定围绕它编写一个 AutoHotKey 包装器,它会自动重新启动程序,直到它没有错
我的一位同事向我展示了计算表中记录的数量,以下 View : CREATE VIEW [SPR].[TablesCount] AS SELECT s.name cSchema,
我是一名优秀的程序员,十分优秀!