You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态线程数下类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:01:43