进程和线程的区别:
进程是程序执行和资源管理的最小单位,子进程由其父进程创建,子进程会继承父进程的代码,数据,文件描述符等,但一旦创建了子进程,父子进程就相当于分别执行的两个程序,但二者可以通信;他们拥有各自的地址空间;执行时,他们之间需要不断切换,内核就要不断刷新cache和页表,系统开销较大;
为减小系统开销,一个进程可创建多个线程,线程共享该进程的地址空间,有效避免了cache和也变的不断刷新,线程之间共享:代码,数据,文件描述符,信号处理函数,pid以及ppid等,但他们也各自拥有自己的线程ID,PC计数器,errno错误号等
下面来看看pthread_create的声明:
#include<pthread.h>
int pthread_create(pthread_t *thread, pthread_addr_t *arr,void* (*start_routine)(void *), void *arg);成功则返回0
thread :用于返回创建的线程的ID
arr : 用于指定的被创建的线程的属性,上面的函数中使用NULL,表示使用默认的属性
start_routine : 这是一个函数指针,指向线程被创建后要调用的函数
arg : 用于给线程传递参数,在本例中没有传递参数,所以使用了NULL
编译的时候,一定要加上-lpthread选项,不然会报错:
undefined reference to `pthread_create'
#include<stdio.h>
#include<pthread.h>
static int i=0;
void *print_thread_id(void *arg)
{
printf("Current thread is %d,id is %u\n",i, (unsigned)pthread_self());
}
int main(int argc, char *argv[])
{
pthread_t thread[5];
for(i=0;i<5;i++){
pthread_create(&thread[i], NULL, print_thread_id, NULL);
sleep(1);
}
printf("Main thread id is %u\n", (unsigned)pthread_self());
return 0;
}
另外,函数pthread_join用来等待一个线程的结束。
头文件 : #include <pthread.h>
函数定义: int pthread_join(pthread_t thread, void **retval);
描述 :
pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。
参数 :
thread: 线程标识符,即线程ID,标识唯一线程。
retval: 用户定义的指针,用来存储被等待线程的返回值。
返回值 : 0代表成功。 失败,返回的则是错误号。
参考:http://www.open-open.com/bbs/view/1319888311124 C语言多线程的相关函数和实例