【问题标题】:pthread_join error code 3pthread_join 错误代码 3
【发布时间】:2017-05-18 14:23:49
【问题描述】:

我的项目有问题。 它向我抛出错误代码 3。

我只是添加了我的部分代码,让你看看我做了什么。 在 main.cpp 我在线程上声明然后我发送到 initRequestThreads(in thread.h) 以创建线程。然后在 main.cpp 我让主进程等待它。

main.cpp

pthread_t *requestersThreads = new pthread_t[Length_Tasks];
requestsPool->initRequestThreads(&requestersThreads);
void*  status;


// wait for all requests threads
for(t=0; t<Length_Tasks; t++) {
    rc = pthread_join(requestersThreads[t], &status);
    if (rc) {
        cout<<"ERROR; return code from pthread_join() is "<< rc <<endl;
        exit(-1);
    }
    cout<<"Main: completed join with REQUEST thread " << t <<" having a status of "<<(long)status<<endl;
}

// wait for all resolvers threads
for(t=0; t<resolveThreadsAmount; t++) {
    rc = pthread_join(reoslveThreads[t], &status);
    if (rc) {
        cout<<"ERROR; return code from pthread_join() is "<< rc <<endl;
        exit(-1);
    }
    cout<<"Main: completed join with RESOLVER thread " << t <<" having a status of "<<(long)status<<endl;
}


delete[] tasks;
delete[] TaskQueueRequests;
delete[] TaskQueueResolves; 
//delete[] requestersThreads;
//delete[] reoslveThreads;

pthread_mutex_destroy(&TaskQueueResolves_lock);
pthread_cond_destroy(&TaskQueueResolves_cond);

线程池.h

        void initRequestThreads(pthread_t **threads)
    {

        // add the attribute join for the threads
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

        int rc;

        cout << "DEBUG "<< __LINE__<<": numOfThreads:"<<numOfThreadsRequests<<endl;
        for(long i = 0; i < numOfThreadsRequests; i++)
        {   
            threads[i] =  new pthread_t;
            rc = pthread_create(&(*threads[i]), &attr, ThreadPool::OperationRequestThread, (void *)this);  // create thread that get all the thread pool object(this) and preform OperationRequest function
            if(rc)
            {
                cout <<"creating Request thread failed! Error code returned is:"+rc<<endl;
                exit(-1);
            }
            cout << "DEBUG "<< __LINE__<<": Creating Request Thread #" << i+1 << "!\n";
        }

        pthread_attr_destroy(&attr);

}

【问题讨论】:

  • 您是否根据错误编号(EINVAL, ....)测试了 pthread_join 的返回值,它对您的帮助不仅仅是原始错误值。您的代码是 C 和 C++ 的混乱。尝试清理它(使用vector 而不是T*,...)

标签: c++ multithreading pthreads pthread-join


【解决方案1】:

您得到的错误代码是ESRCH - 这意味着您尝试加入的线程不存在。

原因是代码中关于如何处理线程 ID 的未定义行为非常混乱。

pthread_t *requestersThreads = new pthread_t[Length_Tasks];

这会创建一个包含 N 个线程的数组,然后您将指向该数组的指针传递给您的函数

initRequestThreads(&requestersThreads);

现在,在您的线程创建循环中,您可以这样做

threads[i] =  new pthread_t;
pthread_create(&(*threads[i]), &attr /*... */

在这里你完全弄乱了你的数组并触发了未定义的行为。在您的函数中,threads 不是数组!它是数组的地址。您无法使用array subscript operator ([]) 访问它。其余的只是对这里已经发生的伤害的侮辱。

如果您正在编写 C++11 及更高版本(正如您在 2017 年应该使用的那样),您应该使用 C++11 std::thread。如果您由于某种原因被绑定到 C++2003,那么您至少应该停止这种可怕的动态数组业务并将指针传递给那些,而是使用 std::vector&lt;pthread_t&gt; 作为函数的输出参数。

【讨论】:

  • 这就是我所做的。我看不出有什么问题。无论如何,我不能使用向量,因为那是任务。它仍然无法正常工作
猜你喜欢
  • 2013-10-17
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 2016-09-13
  • 2015-05-02
  • 1970-01-01
  • 2014-01-25
  • 2015-07-06
相关资源
最近更新 更多