[英]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.