我们有了进程的概念为什么还需要线程呢?其实线程是轻量级的进程,使用线程可以节省系统的资源,创建了线程以后程序中就有多段程序在一起执行了。编写linux多线程程序,需要使用头文件pthread.h,链接时候需要用到线程库libpthread.so。下面看看代码中具体需要如何做吧。

#include <stdio.h>
#include <stdlib.h>//线程函数的头文件
#include <pthread.h>

//线程函数的参数和返回值都是void *类型的
void * task(void * arg)
{
    double * d = (double *)arg;
    printf("主函数中传入的参数是:%lf\n",*d);
    int i;
    for(i = 0;i<5;i++)
    {
        printf("task:%d\n",i);
		//usleep()类似于sleep,一个参数是微妙一个是秒,当使用更精确的时间时,使用usleep
        usleep(1000000);
    }
	//pthread_self()函数取当前线程的ID
    printf("task:task pthread id is:%lu\n",pthread_self());
}

int main()
{

    pthread_t pid;
    double d = 3.14;
	//第一个参数用来存储线程的ID,第二个参数是线程的属性,一般传0,第三个参数是一个函数的指针,当线程创建
	//的时候主线程继续执行,另一个线程就会执行这个函数了,第四个参数是向线程函数里边传入的参数
    int ret = pthread_create(&pid,0,task,(void *)&d);
	//创建线程成功的话返回的是0
	if(ret != 0)
        perror("pthread_create"),exit(-1);

    int i = 0;
    for(;i<5;i++)
    {
        printf("main:%d\n",i);
        sleep(1);
    }
	//pthread_self取当前线程ID
    printf("main:task pthead id is:%lu,main pthead id is:%lu\n",pid,pthread_self());

	//阻塞当前的线程,直到指定的线程中止,第一个参数就是等待的线程ID,第二个参数是void **类型的,用来接收pid线程的返回值
    pthread_join(pid,NULL);

    return 0;

}

linux程序设计多线程编程

 

接着再说一下线程的分离状态和非分离状态,线程的非分离状态是有其他线程等待它的结束,当pthread_join返回的时候,这个线程才会终止,才会释放自己的资源。如果是分离状态的话,没有线程等待它的结束,这个线程一结束就会释放自己的资源的,默认情况下线程是分离状态的。设置线程为分离状态是在pthread_create()的第二个参数里边设置,具体怎么设置就不说了,大家百度google吧,在编程的时候我们最好采用分离状态或者使用pthread_join()函数来等待线程的结束。