高质量嵌入式Linux C编程学习摘要

2019-07-13 02:06发布

1、多线程方面 1)pthread_create()创建的线程默认情况下是非分离状态的线程,如果修改线程的状态属性,需要使用pthread_attr_getdatachstate()和pthread_attr_setdatachstate()来修改线程的属性。PTHRED_CREATE_DETACHED为分离状态,PTHREAD_CREATE_JOHNABLE是非分离状态。 2)pthread_john()仅适用于非分离状态的目标线程,其作用是等待线程退出,以便释放线程的资源。如果没有必要等待特定线程终止之后进行其他处理,则可以把线程设置为分离状态。 3)pthread_exit()和pthread_john()的几点说明 a、线程自己运行结束,或者调用pthread_exit结束,线程都会释放自己独有的空间资源。 b、如果线程是非分离的,则线程会保留线程的ID号,直到其他线程通过"johning"这个线程确认已经死亡。 c、如果线程是分离的,不需要pthread_exit,线程会自己运行结束,并且释放所有的资源(包括ID号)。 d、子线程最终一定要用pthread_john()或者设置为分离状态结束线程,否则线程的资源不会完全释放。 e、主线程运行pthread_exit()会结束主线程,但是对子线程没有影响。 f、主线程结束则整个程序结束,所以最好在主线程中使用pthread_john()来等待各子线程运行结束,使用john一个线程可以等待多个线程结束。 g、使用john的线程会阻塞,知道john的线程结束,john函数返回,但是它对被john的线程没有影响。 h、如果子线程使用exit()则整个进程结束。 4)线程的同步  ------互斥锁和条件变量 a)两种初始化方式: 静态初始化:pthread_mutex_t  mutex= PTHREAD_MUTEX_INITIALIZER                   pthread_cond_t  cond=PTHREAD_COND_INITIALIZER 动态初始化:               pthread_mutex_init(&mutex,NULL);               pthread_cond_init(&cond,NULL); b)联合使用实现线程的严格同步 //线程1代码 pthread_mutex_lock(&mutex); if(条件成立) pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); //线程2代码 pthread_mutex_lock(&mutex);
while(条件成立) pthread_cond_wait(&cond,&mutex);
pthread_mutex_lock(&mutex);
其中,pthread_cond_wait()可以看做解锁线程锁,等待条件为ture,加锁线程锁等几个动作的合体。
5)多线程 每个线程独有的:一个指向当前被执行指令的指令指针,一个栈,一个寄存器的集合,一个私有的数据区。 共有的:该进程中所包含的地址空间。