多线程编程(thread.c)

在操作系统原理的术语中,线程是进程的一条执行路径。线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,所有的线程都是在同一进程空间运行,这也意味着多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。 一个进程可以有很多线程,每条线程并行执行不同的任务。
下面是同一进程下的线程示意图:在这里插入图片描述
线程可以提高应用程序在多核环境下处理诸如文件I/O或者socket I/O等会产生堵塞的情况的表现性能。在Unix系统中,一个进程包含很多东西,包括可执行程序以及一大堆的诸如文件描述符地址空间等资源。在很多情况下,完成相关任务的不同代码间需要交换数据。如果采用多进程的方式,进程的创建所花的时间片要比线程大些,另外进程间的通信比较麻烦,需要在用户空间和内核空间进行频繁的切换,开销很大。但是如果使用多线程的方式,因为可以使用共享的全局变量,所以线程间的通信(数据交换)变得非常高效。
创建线程
在线程创建成功后,会先生成一个缺省线程,我们称之为主线程,主线程从main函数进入线程,然后调用pthread_creat()创建子线程,子线程也可以有自己的入口函数,该函数由用户在创建的时候指定。每个线程都有自己ID,可以通过pthread_self()函数获取。除主线程外,其他线程之间是对等关系。
主线程和子线程的关系是:**无论子线程执行完毕与否,一旦主线程执行完毕退出,所有
子线程执行都会终止。**这时整个进程僵死或者结束,部分线程保持一种终止执行还未销毁的状态,而进程必须在其所有的线程销毁后销毁,这时进程处于僵死状态。线程程函数执行完毕退出,或以其他非常方式终止,线程进入终止态,但是为线程分配的系统资
源不一定释放,可能在系统重启之前,一直都不能释放,终止态的线程,仍旧作为一个线程实体存在于操作系统中,什么时候销
毁,取决于线程属性。在这种情况下,主线程和子线程通常定义以下两种关系:
1可会合:
这种关系下,主线程需要明确执行等待操作,在子线程结束后,主线程的等待操作执行完毕,子线程和主线程会合,这时主线程继续执行等待操作之后的下一步操作。主线程必须会合可会合的子线程。在主线程的线程函数内部调用子线程对象的wait函数实现,即使子线程能够在主线程之前执行完毕,进入终止态,也必须执行会合操作,否则,系统永远不会主动销毁线程,分配给该线程的系统资源也永远不会释放。
2相分离
表示子线程无需和主线程会合,也就是相分离的,这种情况下,子线程一旦进入终止状态,这种
方式常用在线程数较多的情况下,有时让主线程逐个等待子线程结束,或者让主线程安排每个子线程结束的等待顺序,是
很困难或不可能的,所以在并发子线程较多的情况下,这种方式也会经常使用。

线程的分离状态决定一个线程以什么样的方式来终止自己,在默认的情况下,线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束,只有当pthread_join函数返回时,创建的线程才算终止,释放自己占用的系统资源,而分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。

下面使用一个例子来讲解创建线程的基本使用和例子:vim thread.c

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <errno.h>
 4 #include <stdlib.h>
 5 #include <unistd.h>
 6 #include <pthread.h>
 7
 8 void *thread_worker1(void *args);
 9 void *thread_worker2(void *args);
10
11 int main(int argc, char **argv)
12 {
   
13 int shared_var = 1000;
14 pthread_t tid;
15 pthread_attr_t thread_attr;
16
17
18 if( pthread_attr_init(&thread_attr) )
19 {
   
20 printf("pthread_attr_init() failure: %s\n", strerror(errno));
21 return -1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值