线程
学习了进程后,了解到进程是是资源分配的最小单位,而线程是调度的最小单位,线程相比于进程的不同如下:
- 1.进程拥有独立的地址空间、代码段、数据段、堆栈段,而线程只有独立的堆栈段;
- 2.进程间拥有多种通信方式,而线程间通信通常是通过全局变量或者是在创建线程是进行数据传输;
- 3.运行于同一个进程中的各个线程都是共享大部分数据的;
- 4.创建线程花费的空间远小于创建进程花费的空间;
- 5.线程之间切换时间远小于进程切换时间;
- 6.由于线程间共享数据,所以线程间通信更加便捷;
- 7.fork创建的进程时copy程序,而线程的创建是调用函数
创建线程
创建线程主要使用函数pthread_create()
,该函数包括在库pthread.h
中,所以编程时要调用,而且在编译阶段,最后要加上链接:-lpthread
,因为gcc默认使用C库,所以要把pthread.h
链接上去。
函数原型为:
int pthread_create( pthread_t *restict thread,
const pthread_attr_t *restric attr,
void *( *start_routine )( void* ),
void *restrict arg );
看起来比较晦涩,在程序中经常这样使用:
error = pthread_create( &tid, NULL, ( void* )thread, ( void* )arg );
解释一下:
- 第一个参数:tid会接收创建线程的ID
- 第二个参数:用来设置线程的属性,一般就设置为NULL
- 第三个参数:线程函数运行的起始地址,通俗的讲就是线程要调用的函数,只不过是指针类型的,这样就可以到地址了
- 第四个参数:线程调用函数的参数
在程序中经常会使用这样一段代码创建线程:
error = pthread_create( &tid, NULL, ( void* )thread, NULL );
if( error )
{
printf("thread can not create!\n");
return -1;
}
解释一下:当调用创建线程的函数,当成功创建时,会返回0,创建失败时,返回其他值,所以就根据其返回值的大小来判断创建是否成功。