linux下pthread多线程编程简单示范

进程和线程的区别:

进程是程序执行和资源管理的最小单位,子进程由其父进程创建,子进程会继承父进程的代码,数据,文件描述符等,但一旦创建了子进程,父子进程就相当于分别执行的两个程序,但二者可以通信;他们拥有各自的地址空间;执行时,他们之间需要不断切换,内核就要不断刷新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_t pthread_self(void);
函数作用:获得线程自身的ID。pthread_t的类型为unsigned long int,所以在打印的时候要使用%u方式,否则将产生奇怪的结果。
编译过程及输出结果:



另外,函数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语言多线程的相关函数和实例


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值