线程3-线程池思想

本文探讨了多线程编程中的任务分发方法,重点介绍了能够有效避免计算任务分配不均匀的线程池思想。通过实例展示了如何使用线程池进行任务分配,如筛质数的实现。
摘要由CSDN通过智能技术生成

通常多线程编程任务分发包括:分块法、交叉分配法、池类分配法。池类分配法能够最有效地避免计算任务分配不均匀的情况。

线程池思想包括:

1 main线程负责分发任务
2 全局变量num:num>0时有待计算任务,num=0时无算任务需要上游分发,num=-1时无计算任务所有线程退出
3 互斥量:获取资源前一定先上锁,临界区内的跳转语句,跳转到临界区外一定要及时释放锁资源

筛质数代码如下:

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include  <string.h>

#define LEFT  30000000
#define RIGHT 30001911
#define THRUNM 3
//全局变量负责记录资源
static int num=0;
//互斥量
static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;

void *func(void *p)
{
    int i,mark,j;
    int number = (int) p;
    while(1)
    {
        pthread_mutex_lock(&mut);
        while(num == 0)
        {
            pthread_mutex_unlock(&mut);
            sched_yield();  //超级短的sleep
            pthread_mutex_lock(&mut);
        }
        if(num == -1)
        {
            pthread_mutex_unlock(&mut);
            break;
        }
        i = num;
        num = 0;
        pthread_mutex_unlock(&mut);
        mark =1;
        for(j=2; j<i/2;j++)
        {
            if(i%j == 0)
            {
                mark =0;
                break;
            }
        }
        if(mark) {
            printf("%d号线程计算出来:%d is primer\n", number,i);
        }
    }

    pthread_exit(NULL);
}
int main(int argc, char **argv)
{

    int i,err;
    pthread_t tid[THRUNM];
    for(i=0;i<THRUNM;i++)
    {
        err = pthread_create(tid+i, NULL, func, (void *)i); //i一个地址被THRUNM个指针指向
        if(err)
        {
            fprintf(stdout,"pthread_create %s\n", strerror(err));
            exit(1);
        }
    }
    //main线程负责下发任务
    for(i=LEFT;i<=RIGHT;i++)
    {
        pthread_mutex_lock(&mut);
        //任务还在未被抢走
        while(num != 0)
        {
            pthread_mutex_unlock(&mut);
            sched_yield();  //超级短的sleep,不会造成进程调度颠簸
            pthread_mutex_lock(&mut);
        }
        num = i;
        pthread_mutex_unlock(&mut);
    }
    sched_yield();
    pthread_mutex_lock(&mut);
    //退出线程
    num = -1;
    pthread_mutex_unlock(&mut);
    for(i=0;i<THRUNM;i++)
    {
        pthread_join(tid[i], NULL);
    }
    pthread_mutex_destroy(&mut);
    exit(0);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值