【发布时间】:2018-12-01 05:23:03
【问题描述】:
我有代码可以锁定(某个库的)每个函数,并且我想对其进行优化。给定函数A和B,我不介意任何A与任何其他A同时运行,或任何B与任何其他B同时运行,但没有A可以同时运行任何B 正在运行,反之亦然。线程数是动态的,出于我无法控制的原因,我不得不对互斥锁和条件变量使用静态分配(即PTHREAD_MUTEX_INITIALIZER)。
我有一种预感,最有效的方法是两个条件变量。使用pthread_mutex_trylock 允许一个函数(即A)并行运行,而另一个必须序列化。还有 *trylock 静态初始化实际上是未定义的行为...
编辑:
也许是这样的?我不确定这是否:
- 可以更简单。毕竟,互斥锁是使用信号量实现的,但需要四个互斥锁和两个条件变量来实现基本上是逆信号量的东西。
- 涵盖所有比赛条件。
- “公平”(超出默认优先级和调度)吗?
static int countA = 0;
static int countB = 0;
static pthread_mutex_t lockCountA = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t lockCountB = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t lockA = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t lockB = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t condA = PTHREAD_COND_INITIALIZER;
static pthread_cond_t condB = PTHREAD_COND_INITIALIZER;
// for B(), just s/B/A/g
static void A(void) {
pthread_mutex_lock(&lockB);
while(countB)
pthread_cond_wait(&condB, &lockB);
pthread_mutex_lock(&lockCountA);
countA += 1;
pthread_mutex_unlock(&lockCountA)
doA();
pthread_mutex_lock(&lockCountA)
countA -= 1;
if countA == 0:
pthread_cond_signal(&condA);
mutex_unlock(&lockCountA)
mutex_unlock(&lockB);
}
【问题讨论】:
-
你需要公平吗?
-
等待
A和许多B,我想进一步阻止B,如果这就是你的意思。 edit:实际上序列化版本(单个互斥体)工作得很好,所以可能不是......?
标签: c pthreads mutex semaphore