我使用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;
}
My Detectdirection Class有两个并行运行的函数。
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。但现在我只创建了两个线程,我有这个错误。可能有什么不对?
答案 0 :(得分:1)
我相信你得到EAGAIN
(基于错误代码11)。那(通常)意味着你的系统没有足够的资源来创建线程了。
[EAGAIN]系统缺乏创建另一个系统所需的资源 线程,或系统强加的线程总数限制 将超过进程{PTHREAD_THREADS_MAX}。
我不太确定以下是否属实。
但是现在我只创建了两个线程而且我有这个错误。可能有什么不对?
下面,
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
- 创建固定数量的线程,并在线程完成当前任务时为其分配新任务。