簡體   English   中英

pthread_join錯誤代碼3

[英]pthread_join error code 3

我的項目有問題。 它會向我拋出錯誤代碼3。

我只添加了部分代碼,讓您看到我做了什么。 在main.cpp中,我在線程上聲明了該線程,然后將其發送到initRequestThreads(在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);

線程池

        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);

}

您得到的錯誤代碼是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<pthread_t>用作函數的輸出參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM