第四章 并发编程
一、并行计算导论
1、顺序算法与并行算法
在描述顺序算法中,常用一个begin-end代码块列出算法。该代码块中的所有步骤都是通过某个任务依次执行的。而并行算法中,cobegin-coend代码块指定并行算法的独立任务。每个任务都是并行执行的。
2、并行性与并发性
理想情况下,并行算法中的所有任务应该同时实时执行。单在单CPU系统中,不能实现。因此,不同任务只能并发执行,并在逻辑上并行执行。并发性是通过多任务处理来实现的。
二、线程
1、线程的原理
线程是某进程同一地址空间上的独立执行单元。创建某个进程就是在一个唯一地址空间创建一个主线程。当某进程开始时,就会执行该进程的主线程。如果只有一个主线程,那么进程和线程实际上并没有区别。但是,主线程可能会创建其他线程。每个线程又可以创建更多的线程等。
2、线程的优点
- 线程创建和切换速度更快;
- 线程的相应速度更快;
- 线程更适合并行计算。
3、线程的缺点
- 由于地址空间共享,线程需要来自用户的明确同步。
- 许多库函数可能对线程不安全,例如传统 strtok()函数将一个字符串分成一连串令牌。通常,任何使用全局变量或依赖于静态内存内容的函数,线程都不安全。为了使库函数适应线程环境,还需要做大量的工作。
- 在单 CPU系统上,使用线程解决问题实际上要比使用顺序程序慢,这是由在运行时创建线程和切换上下文的系统开销造成的。
三、线程管理函数
(1)创建线程
int pthread_create(pthread_t *thread_id,pthread_attr_t *attr,void *(*func)(void*), void *arg);
(2)线程ID
int pthread_equal(pthread_t t1,pthread_t t2);
如果是不同线程,返回0;否则,返回非0。
(3)线程终止
void pthread_exit(void *status);
0退出值表示正常终止,否则为异常终止。
(4)线程连接
int pthread_join (pthread_t thread, void **status ptr);