预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

关于Linux多线程编程 Linux线程分为两类,一是核心级支持线程,在核心级实现线程时,线程的实现依赖于内核,无论是在用户进程中的线程还是系统进程中的线程,他们的创建、撤消、切换都由内核实现。核心只有单线程进程概念,而多线程进程由与应用程序连接的过程库实现。另一类线程是用户级线程,在Linux众多的线程库中,大部分实现的是用户级线程。 系统创建线程的顺序如下:当一个线程启动后,它会自动创建一个线程即主线程(mainthread)或者初始化线程(initialthread),然后就利用pthread_initialize()初始化系统管理线程并且启动线程机制。 Linux线程编程基础 要创建一个多线程程序,必须加载pthread.h头文件。要掌握多线程编程常用的几个函数: 1、创建新线程函数:pthread_create() 2、挂起当前线程函数:pthread_join() 3、线程注册的清除处理函数:pthread_exit() 4、取消一个线程函数:pthread_cancel() 5、挂起当前线程,直到满足某种条件:pthread_cond_init 多线程的同步 1、互斥锁 互斥锁用来保证一段时间内只有一个线程在执行一段代码。当在同一内存空间运行多个线程时,为保证多个线程之间不相互破坏,要创建互斥量,如果一个线程已经锁定一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程被挂起(不占用任何CPU资源),直到第一个线程解除对这个互斥量的锁定为止。第二个线程将被唤醒并继续执行,同时锁定这个互斥量。 创建互斥量时,必须首先声明一个类型为pthread_mutex_t的变量,然后对其进行初始化,结构pthread_mutex_t为不公开的数据类型,其中包含一个系统分配的属性对象。函数pthread_mutex_init用来生成一个互斥锁。 锁定一个互斥量时使用函数pthread_mutex_lock(),它尝试锁定一个互斥量,如果该互斥量已经被其它线程锁定,该函数就把调用自己的线程挂起,一旦该互斥量解锁,它将恢复运行并锁定该互斥量。这个线程在做完它的事情后,必须释放这个互斥量,解除锁定时使用函数pthread_mutex_unlock()。 用完一个互斥量后必须销毁它,这时没有任何线程再需要它了,最后一个使用该互斥量的线程必须销毁它,销毁互斥量时使用函数pthread_mutex_destroy(). 2、条件变量 互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。在某种情况下,例如,在图形用户界面程序中,一个线程读取用户输入,另一个线程处理图形输出,第三个线程发送请求到服务器并处理其响应,当服务器的响应到达时,处理服务器的线程必须可以通知画图形的线程,画图形的线程把相应的结果显示给用户。管理用户输入的线程必须总是能响应用户,例如,允许用户取消正在由处理服务器的线程执行的耗时的操作,这表明线程间必须可以互相传递信息,这时需要引入条件变量。 条件变量是一种可以使线程(不消耗CPU)等待某些事件发生的机制。某些线程可能守候着一个条件变量,直到某个其它的线程给这个条件变量发送一个信号,这时这些线程中的一个线程就会苏醒,处理这个事件。也有可能利用对条件变量的广播唤醒所有守侯着这个条件变量的线程。但条件变量不提供锁定,所以它必须与一个互斥量同时使用,提供访问这个环境变量时必要的锁定。 条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁,并等待条件发送变化。一旦其他的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥量,并重新测试条件是否满足。一般来说,条件变量被用来进行线程间的同步。 下面通过一个例子来介绍条件变量: pthread_mutex_tcount_mutex; pthread_cond_tcont_nonzero; unsignedintcount; decrement_count(){ pthread_mutex_lock(&count_mutex); while(count==0) pthread_cond_wait(&count_nonzero,&count_mutex); count=count–1; pthread_mutex_unlock(&count_mutex); } increment_count(){ pthread_mutex_lock(&count_mutex); if(count==0) pthead_cond_signal(&count_nonzero); count=count+1; pthr