1. 查看源代码
1. 线程与进程
在一些操作中,等待的时间是比较长的,为避免卡顿,或者反应不及时引入线程和进程。
进程是资源分配的最小单位,线程是CPU调度的最小单位。
单进程单线程:一个人在一个桌子上吃菜。
单进程多线程:多个人在同一个桌子上一起吃菜。
多进程单线程:多个人每个人在自己的桌子上吃菜。
ubuntu默认没有pthread库,需要安装。
sudo apt-get install -y glibc-doc manpages-posix-dev
查看pthrea手册,提示:
$ man pthreads
No manual entry for pthreads
#安装manpages
$ sudo apt-get install manpages-posix manpages-posix-dev
2. 编译各个程序并在Ubuntu运行;理解并解释运行状态和结果
2. 多线程
(1)线程的创建与终止
函数
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
说明
参数 用法
返回值 成功:0; 失败:错误号 //Linux环境下,所有线程特点,失败均直接返回错误号。
pthread_t 当前Linux中可理解为:typedef unsigned long int pthread_t;//无符号长整形
参数1 传出参数,保存系统为我们分配好的线程ID
参数2 通常传NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。
参数3 函数指针,指向线程主函数(线程体),该函数运行结束,则线程结束。参数是函数指针,只能传递函数名,不能传递参数。所以就是只能有一个参数。
参数4 线程主函数执行期间所使用的参数。
编译并执行
gcc -o ptread pthread.c -lpthread
./ptread
由于线程之间的竞争可能导致每次输出不一样。
#include<unistd.h>
for (index = 0; index < array_num; index++) { /* 循环创建 5个线程 */
printf("In main: creating thread %ld.\n", index);
returned_code_err = pthread_create(&thr_num_array[index], NULL, thread_function, (void *) index); /* 创建线程 */
sleep(1); //创建线程后延时
(2)进程的连接与分离
函数
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
说明
参数 用法
参数1 被等待的进程表示符
参数2 一个用户定义的指针,可以用来存储被等待线程的返回值
部分代码
for(index=0; index<NUM_THREADS; index++)
{
printf("Main: creating tid_array %ld\n", index);
err = pthread_create(&tid_array[index], NULL, thread_func, (void *)index); /* 创建线程 */
if (err)
{
printf("ERROR; return code from pthread_create() is %d\n", err);
exit(-1);
}
err = pthread_join(tid_array[index], &status); /*等待线程终止,并获取返回值*/
if (err)
{
printf("ERROR; return code from pthread_join() is %d\n", err);
exit(-1);
}
printf("Main: comp