gpt4 book ai didi

c++ - 从 C++ 中的 pthread 创建返回代码是 11

转载 作者:行者123 更新时间:2023-11-30 03:35:09 32 4
gpt4 key购买 nike

我在使用 Pthread 时遇到线程创建问题。我的代码如下。由于篇幅限制,我只展示了一部分。

     Main.c create Detectdirection instance and send to the function.

d = new Detectdirection();
while(run)
{
int ret = d->run_parallel(d);
if(ret == -1)
run = false;
}

我的 Detectdirection 类有两个并行运行的函数:

class Detectdirection{
public:
int run_parallel(void*p);
void *Tracking(void *p);
static void *Tracking_helper(void * p);
void *ReadImage(void *p );
static void *ReadImage_helper(void *p );
private:
pthread_t thread[2];


}
void *Detectdirection::ReadImage(void *p){
Detectdirection *app = (Detectdirection*)p;
while(run){

}
pthread_exit(NULL);
}
void *Detectdirection::Tracking(void *p){
Detectdirection *app = (Detectdirection*)p;
while(run){

}
pthread_exit(NULL);
}

void *Detectdirection::Tracking_helper(void *p){
Detectdirection *app = (Detectdirection*)p;
return ((Detectdirection*)p)->Tracking(app);
}
void *Detectdirection::ReadImage_helper(void *p ){
Detectdirection *app = (Detectdirection*)p;
return ((Detectdirection*)p)->ReadImage(app);
}
int Detectdirection::run_parallel(void* p){
Detectdirection *app = (Detectdirection*)p;
int rc = pthread_create(&thread[0], NULL, app->ReadImage_helper, app);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
return -1;
}

rc = pthread_create(&thread[1], NULL, app->Tracking_helper, app);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
return -1;
}

return 0;
}

编译正常,运行时出现线程创建错误。这种返回类型 11 只有在创建许多线程时才会发生。但是现在我只创建了两个线程并且出现了这个错误。有什么问题吗?

最佳答案

我相信您正在获得 EAGAIN(基于错误代码 11)。这(显然)意味着您的系统没有足够的资源来创建线程了。

POSIX documentation说:

[EAGAIN] The system lacked the necessary resources to create another thread, or the system-imposed limit on the total number of threads in a process {PTHREAD_THREADS_MAX} would be exceeded.

我不太确定以下内容是否属实。

But now I create only two thread and I have that error. What could be wrong?

这里,

  while(run)
{
int ret = d->run_parallel(d);
if(ret == -1)
run = false;
}

您正在循环中创建,每次调用 d->run_parallel() 都会创建两个线程。因此,您可能会创建无限数量的线程因为只有当 pthread_create() 失败时循环才会中断。因此,您可能需要仔细查看此循环,看看您是否真的想按现在的样子去做。

您似乎没有加入您创建的线程。因此,您可以分离线程,以便在线程退出时立即释放特定于线程的资源。你可以这样做:

pthread_detach(pthread_self());

ReadImage_helper()Tracking_helper() 函数中分离它们。这可能会解决您的资源问题。

如果它仍然存在,那么您必须考虑限制系统上同时运行的线程数的方法。一种可能的选择是使用 thread pools -- 创建固定数量的线程并在线程完成当前任务时为其分配新任务。

关于c++ - 从 C++ 中的 pthread 创建返回代码是 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41459177/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com