随着现代计算机技术的发展,越来越多的应用程序采用多线程并发的方式来提高性能和效率。然而,在多线程并发编程的过程中,线程的退出问题一直困扰着程序员们。如果线程没有正确地退出,会导致资源泄漏、死锁等问题,严重地影响程序的性能和稳定性。因此,在,成为了程序员们迫切需要解决的问题。
Linux下有多种方式可以等待线程退出,比较常用的方法包括pthread_join、pthread_cond_wt和pthread_barrier_wt。下面我们一一介绍它们的使用方法和优缺点。
1. pthread_join
pthread_join函数是等待一个线程结束并回收其资源的函数。通过调用pthread_join函数,调用线程会阻塞等待指定的线程结束,直到该线程退出并回收其占用的资源后,才会返回。在阻塞等待线程退出的过程中,调用线程可以继续运行其他的任务,不会浪费CPU资源。
pthread_join函数的参数包括等待的线程ID和线程退出状态。如果线程成功退出,那么线程退出状态为0;如果线程异常退出,那么线程退出状态为一个非零值,可以通过errno获取具体的错误信息。如果需要等待多个线程结束,可以用一个循环结构来连续调用pthread_join函数等待各个线程退出。
pthread_join函数的优点是简单、易用,适合于等待线程数较少的情况。但是,如果等待的线程数较多,那么连续调用pthread_join函数会导致调用线程的阻塞时间较长,对程序的性能造成较大的影响。
2. pthread_cond_wt
pthread_cond_wt函数是等待条件变量的函数,可以用于线程同步和线程间通信。通过调用pthread_cond_wt函数,调用线程可以阻塞等待某个条件变量满足,从而使得其他的线程可以修改和更新这个条件变量。
在使用pthread_cond_wt函数等待线程退出的过程中,需要使用互斥锁pthread_mutex_t来保护条件变量。当一个线程成功退出后,需要更新共享变量所表示的条件,然后通过调用pthread_cond_broadcast或pthread_cond_signal函数唤醒其他阻塞在条件变量上的线程。
pthread_cond_wt函数的优点是可以有效地防止死锁和资源泄漏。但是,在使用pthread_cond_wt函数等待线程退出的过程中,需要使用互斥锁来保护条件变量,这会导致调用线程和其他线程之间的竞争,对程序的性能造成一定的影响。
3. pthread_barrier_wt
pthread_barrier_wt函数是等待一个屏障的函数,可以用于多个线程之间的同步。通过调用pthread_barrier_wt函数,多个线程都会阻塞在一个屏障上,直到所有的线程都到达了这个屏障后才会继续执行后面的代码。
在使用pthread_barrier_wt函数等待线程退出的过程中,需要使用一个屏障pthread_barrier_t,每个线程到达屏障前都需要调用pthread_barrier_wt函数等待其他线程到达。当所有的线程都到达屏障后,屏障会打开,并且所有的线程都会继续执行后面的代码。
pthread_barrier_wt函数的优点是可以有效地保证多个线程之间的同步,防止竞态条件的发生。但是,在使用pthread_barrier_wt函数等待线程退出的过程中,需要使用屏障变量来同步,这会导致程序的复杂性增加,需要对线程的逻辑结构进行重新设计。
综上所述,在,取决于程序的具体实现和需要解决的问题。如果需要等待的线程数较少,那么可以使用pthread_join函数;如果需要等待多个线程退出,并且需要进行线程间的通信和同步,那么可以使用pthread_cond_wt和pthread_barrier_wt函数。无论是哪种方式,都需要对线程的状态进行监控和管理,防止资源泄漏和死锁的发生,从而保证程序的性能和稳定性。
成都网站建设公司-创新互联,建站经验丰富以策略为先导10多年以来专注数字化网站建设,提供企业网站建设,高端网站设计,响应式网站制作,设计师量身打造品牌风格,热线:028-86922220与c语言一样,使用线猛册举程库,pthread线程,例如
#include
#include
#include
struct member
{
int num;
char *name;
};
//结构体后的分号勿漏
void *create(void *arg)
//有void* 型参数传入,不能直接void
{
struct member *temp;
temp=(struct member *)arg;
//结构体变量之间不能直接赋值,但可以通过指针赋地址
printf(“member->枝碧num:%d\n”,temp->num);
printf(“member->name:%s\n”,temp->name);
sleep(1);
return (void *)8;
//这个很有特色,返回一个指向void的数据类型的值,这个值作为后面的exit code
}
int main(int agrc,char* argv)
{
pthread_t tidp;
struct member *b;
void* a;
b=(struct member *)malloc(sizeof(struct member));
//先分配内存空间撒~
b->num=1;
b->name=”mlq”;
//字符串赋值,其他好用简便的方法有: char *p = NULL; p = new char ;
if((pthread_create(&tidp,NULL,create,(void*)b))==-1) /
//
void *
为“无类型指针”,void * 可以指向任何类型的数据
{
printf(“create error!\n”);
return 1;
}
if(pthread_join(tidp,&a))
//调用
pthread_join函数,等待线程结束再继续往下执行,要不然主姿猜进程和下面的线程并行执行
{
printf(“thread is not exit…\n”);
return -2;
}
printf(“thread is exit ,code is %d\n”,(int)a);//不知为啥这里是(int)a,,a不是指针来的么
return 0;
}
#ifndef THREAD_H_
#define THREAD_H_
#include
#include
class Runnable
{
public:
//运行实体
virtual void run() = 0;
};
//线程类
class Thread: public Runnable
{
private:
//线程初始化号
static int thread_init_number;
//当前线程初始化序号
int current_thread_init_number;
//线程体
Runnable *target;
//当前线程的线程ID
pthread_t tid;
//线程的状态
int thread_status;
//线程属性
pthread_attr_t attr;
//线咐唯弯程优先级
sched_param param;
//获取执行方法的指针
static void* run0(void* pVoid);
//内部执行方法
void* run1();
//获取线程序号
static int get_next_thread_num();
public:
//线程的状态-新建
static const int THREAD_STATUS_NEW = 0;
//线程的状态-正在运行
static const int THREAD_STATUS_RUNNING = 1;
//线程的状态-运行结束
static const int THREAD_STATUS_EXIT = -1;
//构造函数
Thread();
//构造函数
Thread(Runnable *target);
//析构
~Thread();
//线程的运行体
void run();
//开始执行线程
bool start();
//获取线程状态
int get_state();
//等待线程直至退出
void join();
//等待线程退出或者超时
void join(unsigned long millis_time);
//比较两个线程时候相同,通过current_thread_init_number判断
bool operator ==(const Thread* other_pthread);
//获取this线程ID
pthread_t get_thread_id();
//获取当前线程ID
static pthread_t get_current_thread_id();
//当前线程是否和某个线程相等,通过tid判断
static bool is_equals(Thread* iTarget);
//设置线程的类型:绑定/非绑山型定
void set_thread_scope(bool isSystem);
//获取线程的类型:绑定/非绑定
bool get_thread_scope();
//设置线程的优先级,1-99,其中99为实时,意外的为普通
void set_thread_priority(int priority);
//获取线程的优先级
int get_thread_priority();
};
int Thread::thread_init_number = 1;
inline int Thread::get_next_thread_num()
{
return thread_init_number++;
}
void* Thread::run0(void* pVoid)
{
Thread* p = (Thread*) pVoid;
p->run1();
return p;
}
void* Thread::run1()
{
thread_status = THREAD_STATUS_RUNNING;
tid = pthread_self();
run();
thread_status = THREAD_STATUS_EXIT;
tid = 0;
pthread_exit(NULL);
}
void Thread::run()
{
if (target != NULL)
{
(*target).run();
}
} 衡闷
Thread::Thread()
{
tid = 0;
thread_status = THREAD_STATUS_NEW;
current_thread_init_number = get_next_thread_num();
pthread_attr_init(&attr);
}
Thread::Thread(Runnable *iTarget)
{
target = iTarget;
tid = 0;
thread_status = THREAD_STATUS_NEW;
current_thread_init_number = get_next_thread_num();
pthread_attr_init(&attr);
}
Thread::~Thread()
{
pthread_attr_destroy(&attr);
}
bool Thread::start()
{
return pthread_create(&tid, &attr, run0, this);
}
inline pthread_t Thread::get_current_thread_id()
{
return pthread_self();
}
inline pthread_t Thread::get_thread_id()
{
return tid;
}
inline int Thread::get_state()
{
return thread_status;
}
void Thread::join()
{
if (tid > 0)
{
pthread_join(tid,NULL);
}
}
void Thread::join(unsigned long millis_time)
{
if (tid == 0)
{
return;
}
if (millis_time == 0)
{
join();
}
else
{
unsigned long k = 0;
while (thread_status != THREAD_STATUS_EXIT && k tid;
}
void Thread::set_thread_scope(bool isSystem)
{
if (isSystem)
{
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
}
else
{
pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS);
}
}
void Thread::set_thread_priority(int priority)
{
pthread_attr_getschedparam(&attr,¶m);
param.__sched_priority = priority;
pthread_attr_setschedparam(&attr,¶m);
}
int Thread::get_thread_priority(){
pthread_attr_getschedparam(&attr,¶m);
return param.__sched_priority;
}
会的。例如段错误之类的错误,直接会导致程序退出。 所以你要主线程还能正常运行的,就要对子线程的错误做错误处理。
一般情况会自己关闭,如果很长时间都还在,就强制kill -9
闺怨(王昌龄)
我看过一个例子使用pthread_timedjoin_np可以,不过我在源蠢linux的森纤pthread库里找不到这雹春陪条函数
timespec joinDelay;
joinDelay.tv_nsec = milliseconds;
pthread_timedjoin_np(thread, NULL, &joinDelay);
关于linux等待线程退出的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
成都创新互联科技有限公司,经过多年的不懈努力,公司现已经成为一家专业从事IT产品开发和营销公司。广泛应用于计算机网络、设计、SEO优化、关键词排名等多种行业!
本文名称:Linux下如何优雅地等待线程退出(linux等待线程退出)
本文来源:http://www.shufengxianlan.com/qtweb/news28/366078.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联