动态线程数下类Barrier同步实现故障:程序软锁排查
动态活跃线程数的Barrier同步实现问题
我需要实现一个类似barrier的同步函数,支持活跃线程数动态变化——之前尝试通过销毁并重初始化barrier来处理线程退出,但没成功。现在自己写的替代函数无法正常运行,程序出现软锁。
试过原生barrier、让退出线程也调用barrier_wait等方案,都没法避免软锁,总有线程滞留在barrier_wait中。
自定义同步函数SynchThreads(替代pthread_barrier_wait)
void SynchThreads() { pthread_mutex_lock(&lock); if (threadsGoingToWait < maxActiveThreads) { threadsGoingToWait++; pthread_cond_signal(&condVar2); pthread_cond_wait(&condVar1, &lock); } else { threadsGoingToWait=1; pthread_cond_broadcast(&condVar1); } pthread_mutex_unlock(&lock); }
线程退出时修改maxActiveThreads的代码
pthread_mutex_lock(&tlock); maxActiveThreads--; if (maxActiveThreads>0) { pthread_cond_wait(&condVar2, &tlock); pthread_cond_broadcast(&condVar1); } else pthread_cond_broadcast(&condVar2); pthread_mutex_unlock(&tlock);
Pthread变量初始化代码
pthread_barrier_init(&barrier, NULL, maxActiveThreads); pthread_mutex_init(&lock, NULL); pthread_mutex_init(&tlock, NULL); pthread_cond_init(&condVar1, NULL); pthread_cond_init(&condVar2, NULL);
我搞不懂程序软锁的原因,按逻辑只要有至少一个线程在运行或等待,就应该唤醒其他调用cond_wait的线程。
补充说明
移除condVar2并在循环末尾用barrier_wait后,程序不再软锁,但同步仍然异常。我正在将顺序高斯消元函数并行化,目前存在矩阵或向量值错误的问题,希望通过分布同步点解决,线程函数代码如下:
static void* gauss_par(void* params) { /*获取线程及相关数据*/ for (int k = startRow; k < N; k+=threadCount) /* 外层循环 */ { SynchThreads(); /* 除法步骤 */ SynchThreads(); /* 向量y和矩阵对角线处理 */ SynchThreads(); for (int i = k+1; i < N; i++) { /* 消元步骤 */ SynchThreads(); /* 向量b和矩阵置零处理 */ SynchThreads(); } } }
内容的提问来源于stack exchange,提问作者Atryx10
相关产品推荐
相关产品推荐

