【问题标题】:why is it hanged in pthread_cond_signal为什么挂在 pthread_cond_signal
【发布时间】:2016-02-23 00:30:17
【问题描述】:

我实现了一个“thread_pool”,它导致 pthread_cond_signal 挂起。我很好奇为什么会这样?

这是 gdb 堆栈:

(gdb) bt

#0  0x00007fc1ac92ee24 in __lll_lock_wait () from /opt/compiler/gcc-       4.8.2/lib/libpthread.so.0
#1  0x00007fc1ac92ccb1 in pthread_cond_signal@@GLIBC_2.3.2 () from /opt/compiler/gcc-4.8.2/lib/libpthread.so.0
#2  0x00000000004ac736 in ThreadPool::dispatch (this=0x415e0a0, method=0x40d1080) at ../../common/thread_pool.cc:76

这里是sn-p的代码:

int ThreadPool::dispatch(Method* method) {
    pthread_mutex_lock(&_method_lock);
    _method_list.push_back(method);
    pthread_cond_signal(&_method_cond);
    pthread_mutex_unlock(&_method_lock);

    return 0;
}

ThreadPool::Method* ThreadPool::get() {
    Method* method = NULL;

    pthread_mutex_lock(&_method_lock);

    if (_method_list.empty()) {
        struct timeval now;
        struct timespec timeout;
        gettimeofday(&now, 0);
        timeout.tv_sec = now.tv_sec + 1;
        timeout.tv_nsec = now.tv_usec * 1000;

        pthread_cond_timedwait(&_method_cond, &_method_lock, &timeout);
    }

    if (!_method_list.empty()) {
        method = _method_list.front();
        _method_list.pop_front();
    }
    pthread_mutex_unlock(&_method_lock);

    return method;
}

【问题讨论】:

  • 挂起?不就是在等待你指定的超时时间吗?
  • @Let_Me_Be 它没有等待。调用pthread_cond_signal时挂起
  • @Mohamad Elghawi 我没有用析构函数以外的方法破坏互斥锁和 condvar。所以我不认为它是重复的。
  • @user3619782 你能显示更多你的代码吗?您如何从外部使用它?

标签: c++ locking signals threadpool mutex


【解决方案1】:

我确实破坏了条件并锁定,然后线程池被破坏,而计时器试图将一些任务分派到线程池。在线程池被破坏之前忘记删除定时器了。

【讨论】:

    猜你喜欢
    • 2022-08-16
    • 2022-09-29
    • 2015-03-09
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2017-06-02
    相关资源
    最近更新 更多