您的位置:首页 > 运维架构 > Linux

Linux入门:多线程编程之线程控制

2017-04-05 18:32 357 查看
     在Linux下,并没有真正意义上的线程的概念,是用进程来模拟线程的。

     进程是系统分配资源的基本实体,可以被独立调用,也可以由多个线程协作完成任务。线程是在进程的内部(地址空间内)运行的执行流。

     在一些重要的方面,线程执行是不同于进程的。移位一个线程的上下文要比一个进程的上下文小得多,线程的上下文切换要比进程的上下文切换快得多。另一个不同就是线程不像进程那样,不是按照严格的父子层次来组织的,和一个进程相关的线程组成一个对等(线程)池,独立于其他进程创建的线程。主线程和新线程的区别仅在于它总是进程中第一个运行的线程。对等池概念的主要影响是,一个线程可以杀死它的任何对等线程,或者等待它的任意对等线程终止,另外,每个对等线程都能读写相同的共享数据。

    同一进程的多个线程共享地址空间(代码和数据),还共享以下资源和环境:

(1)文件描述符表

(2)每种信号的处理方式(SIG_IGN,SIG_DFL或者自定义的信号处理函数)

(3)当前工作目录

(4)用户id和组id

但有些资源是每个线程各有一份的:

(1)线程id

(2)上下文,包括各种寄存器的值,程序计数器和栈指针

(3)栈空间(每个线程会有自己的临时变量存放在私有的栈结构中)

(4)errno变量

(5)信号屏蔽字

(6)调度优先级

一、线程创建



二、线程等待(新线程也可以等待主线程,但一般不这样做)

只要进程退出,线程必然退出。它只能等待一个指定的线程终止,不能像pthread_wait那样等待任意一个线程终止。



三、线程终止(主线程退出相当于进程退出,新线程都将退出)

1.在线程函数内直接return

2.在线程函数内调用pthread_exit函数(直接调用exit会让进程退出)



3.取消线程(一个线程可以被主线程取消也可以自己取消自己)



pthread_exit或者return返回的指针所指向的内存单元必须是全局变量或用malloc分配的,不能在线程函数的栈上分配,因为其他线程得到这个返回指针时线程函数已经退出了。(当线程需要返回一个大于4字节的内容(如一个结构体),则就要用malloc申请空间,然后返回结构体的地址)

四、线程分离

在任意一个时间点上,线程是可结合的或者是分离的。一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源(例如栈)是没有被释放的。相反,一个分离的线程是不能被其他线程回收或杀死的。它的存储器资源在它终止时由系统自动释放。

默认情况下,线程被创建成可结合的。为了避免存储器 泄漏,每个可结合线程都应该要么被其他线程显式地收回,要么通过调研pthread_detach函数被分离。(在进程退出时,被分离的线程也还是会退出)



程序示例:

#include <stdio.h>
#include <pthread.h>

void *thread_run(void *arg)
{
int count = 0;
while(count++ < 5)
{
sleep(1);
printf("T am new thread,tid:%lu, pid:%d\n", pthread_self(), getpid());
}
pthread_exit((void *)123);
}

int main()
{
pthread_t id;
pthread_create(&id, NULL, thread_run, NULL);
while(1)
{
sleep(1);
printf("I am main thread,tid:%lu, pid:%d\n", pthread_self(), getpid());
}
sleep(4);
int ret2 = pthread_cancel(id);
void *val = NULL;
int ret = pthread_join(id, &val);
printf("The new thread is quit.val:%d\n", (int)val);
printf("%lu\n",id);
return 0;
}


运行结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息