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

来源:互联网 发布:范冰冰演技 知乎 编辑:程序博客网 时间:2024/05/21 06:16

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)多线程

每个线程独有的:一个指向当前被执行指令的指令指针,一个栈,一个寄存器的集合,一个私有的数据区。

共有的:该进程中所包含的地址空间。

原创粉丝点击