Linux系统的多线程编程

多线程

线程概念

线程可以看做是一个正在运行的函数,一个进程中至少有一个函数运行,那么也就是说一个进程至少有一个线程。在函数中创建出来的线程,彼此之间是兄弟关系。posix线程是一套线程标准,而不是一套实现。

线程的标识

pthread_t数据类型的线程标识符tid。在终端使用ps axm命令查看线程信息。
pthread_equal(tid1,tid2):比较两个线程标识,相同返回非0值,不相同返回0值。
注意:写完与线程相关的程序后,用gcc编译器编译时需要加上链接选项-pthread,即gcc –pthread 文件.c。或者可以写一个makefile文件,在其中写上LDFLAGS+=-pthread。
pthread_self():返回当前线程的标识。

线程的创建

pthread_create(&tid,属性,函数指针,函数参数):在当前的进程中创建一个新的线程,成功返回0,失败返回错误值。
&tid:回填一个线程标识符给pthread_t类型的tid变量中。这里要对变量取地址;
属性:写NULL取默认属性;
函数指针:创建线程就等于要同时再跑一个兄弟函数,所以我们创建兄弟函数应该是一个函数指针,这里就能直接填兄弟函数指针名。
函数参数:兄弟线程函数需要的参数的地址。
注意:线程的调用取决于调度器的策略。

线程的终止

线程终止的3种方式:
1.线程从启动例程返回,使用return;
2.线程可以被同一进程中的其他线程取消;
3.线程调用pthread_exit()函数终止该线程。
pthread_exit(函数返回值):线程结束,并带回一个值,没有返回值就在参数中填NULL。

线程的取消

pthread_cancel(要取消的线程id号);

线程的收尸(回收资源)

pthread_join(tid,回填线程的返回值):给一个进程收尸,并带回pthread_exit函数的参数返回值。tid是要收尸的线程id号。

例、采用池类算法:用多线程筛选出30000000-30000200之间的质数,并输出所有质数。池类算法是多线程(多进程)处理数据比较好的一种算法,在以后使用多进程(多线程)的过程中比较常用。程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define MIN 30000000
#define MAX MIN+200
#define TNUM 5

static int num=0;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *pthread_start(void *arg)
{
    int n,i,flag=1;
    while(1)
    {
        pthread_mutex_lock(&mutex);
        while(num == 0)
        {
            pthread_mutex_unlock(&mutex);
            sched_yield();
            pthread_mutex_lock(&mutex);
        }
        if(num < 0)
        {
            pthread_mutex_unlock(&mutex);
            break;
        }
        n=num;
        num=0;
        pthread_mutex_unlock(&mutex);
        for(i=2;i<=n/2;i++)
        {
            if(n % i == 0)
            {
                flag=0;
                break;
            }
        }
        if(flag)
            printf("%d\n",n);
        flag=1;
    }
    pthread_exit(NULL);
}

int main(void)
{
    int i;
    pthread_t tid[TNUM];
    int res;
    for(i=0;i<TNUM;i++)
    {
        res = pthread_create(&tid[i],NULL,pthread_start,NULL);
        if(res)
        {
            printf("error!\n");
            exit(-1);
        }
    }

    for(i=MIN;i<=MAX;i++)
    {
        pthread_mutex_lock(&mutex);
        while(num != 0)
        {
            pthread_mutex_unlock(&mutex);
            sched_yield();
            pthread_mutex_lock(&mutex);
        }
        num=i;
        pthread_mutex_unlock(&mutex);
    }

    pthread_mutex_lock(&mutex);
    while(num != 0)
    {
        pthread_mutex_unlock(&mutex);
        sched_yield();
        pthread_mutex_lock(&mutex);
    }
    num=-1;
    pthread_mutex_unlock(&mutex);

    for(i=0;i<TNUM;i++)
    {
        pthread_join(tid[i],NULL);
    }

    pthread_mutex_destroy(&mutex);//销毁互斥量
    exit(0);
}

猜你喜欢

转载自blog.csdn.net/qq_42249237/article/details/81612250