一个并发程序开多少线程合适?

最近在和朋友讨论的过程中,朋友说线程开得多性能好,理由是系统中已经有成百上千的线程,并发程序开的线程越多分配到CPU的概率越高。我不认可该观点,下面来验证。

 

测试场景:

硬件:HP G6(8核16流水线)

操作系统:Suse10 SP2

 

测试程序实现描述:

定义一个long型数组,假设有n个Entry,当有m个线程时,线程1对0~(n/m-1)中元素依次循环累加,线程2对n/m~(2n/m-1)元素依次循环累加...。最后把long型数组所有entry相加,看得到的数(此数就是所有线程对数组操作的次数)

 

测试结果:

Thread Num   Result1                     Result2                     Result3

2   Threads:   186,793,032,169        186,697,212,695

4   Threads:   373,926,225,686        373,407,260,760

8   Threads:   742,705,309,211        746,706,667,311        744,690,656,181

16 Threads:   794,363,499,559

20 Threads:   794,068,481,342        793,703,559,671        794,294,479,450

测试结论:

1.当Active的线程数等于CPU流水线数时,系统性能最高;

2. 当然实际系统中有IO和网络操作时,很多时候瓶颈可能在IO;

3. 在设计系统时,要考虑到系统Active线程数,因为很多线程可能会进入block状态,不能一定认为线程数等于流水线就是性能最好;

测试程序:

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

#define ARRAY_SIZE 1000000

struct range
{
    int start;
    int end;
};

long array[ARRAY_SIZE];
int threadStopFlag = 0;

void *updateArray(void * ptrRange);

int main(int argc, char* argv[])
{
    struct range *rangeArray[100] = {NULL};
    pthread_t threadIdArray[100];
    int numOfThreads = 0;
    int i = 0;
    int size = 0;
    int error = 0;
    long result = 0;

    //check the number of parameters
    if(2 != argc)
    {
        printf("usage: a.out threadnumber/n");
        return -1;
    }

    //validate the parameter
    numOfThreads = atoi(argv[1]);
    if(numOfThreads > 100)
    {
        printf("The number of threads is greater than 100/n");
        return -1;
    }   

    //create the worker thread
    size = ARRAY_SIZE / numOfThreads;
    for(i=0; i< numOfThreads; i++)
    {
        //calculate the start and end value
        rangeArray[i] = (struct range*)malloc(sizeof(struct range));
        if(NULL == rangeArray[i])
        {
            return -1;
        }
       
        rangeArray[i]->start = i * size;
        if(i != numOfThreads - 1)
        {
            rangeArray[i]->end = rangeArray[i]->start + size - 1;
        }
        else
        {
            rangeArray[i]->end = ARRAY_SIZE -1;
        }       

        //create the threads
        error = pthread_create(&threadIdArray[i], NULL, updateArray, (void *)rangeArray[i]);
        if(error != 0)
        {
            printf("pthread is not created./n");
            return -1;
        }
       
    }

    //kill all the worker threads
    sleep(300);
    threadStopFlag = 1;

    sleep(60);
    //free the malloc memory
    for(i=0; i < numOfThreads; i++)
    {
        free(rangeArray[i]);
        rangeArray[i] = NULL;
    }

    //calculate the total number
    for(i=0; i<ARRAY_SIZE; i++ )
    {
        result += array[i];
    }
    printf("The total number is %ld/n", result);
    return 0;
}

void *updateArray(void * ptrRange)
{
    struct range *arrayRange;
    int pointer = 0;;
    int start = 0;;
    int end = 0;

    arrayRange = (struct range *)ptrRange;
    start = arrayRange->start;
    end = arrayRange->end;
    pointer = start;
   
    while(1)
    {
        if(pointer > end)
        {
            pointer = start;
        }

        array[pointer] += 1;
        pointer++;

        if(1 == threadStopFlag)
        {
            pthread_exit(0);
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面试高级发的期间整理的面试题目,记录我面试遇到过的并发题目以及答案 目录 并发 常说的并发问题是哪些;资源竞争、死锁、事务、可见性 死锁 如何排查死锁; 产生死锁的必要条件: 如何解决解决死锁; 锁 AQS:实现锁的最核心框架,abstractqueueSynchronizer抽象队列同步器 synchronized synchronized的底层实现 为什么重量级锁也叫互斥锁; 互斥锁(重量级锁)也称为阻塞同步、悲观锁; 为什么说重量级锁销大呢; synchronize实现基础syn为什么一定有可重入特性; synchronized 实现可重入性; reenlock和synchronize区别; ReentrantLock如何实现可重入性 volatile作用; wait 与 sleep 的有什么不同?回答的要点四个: Thread.sleep()和LockSupport.park()的区别 Object.wait()和LockSupport.park()的区别 线程线程线程池的五种状态 线程池类型 线程池原理 线程池构造函数参数; 线程池的4种拒绝策略; 线程池中任务结束后会不会回收线程线程有哪几种创建方式; Semaphore+CountDownLatch+CyclicBarrier区别; 描述一下Java线程的生命周期,线程状态; 线程之间的通信方式; 描述一下notify和notifyAll区别; synchronized关键字加在静态方法和实例方法的区别; 用锁的注意点; cas机制可能导致的问题ABA,什么是ABA; 程序多少线程合适; 实现一下DCL(双重检查锁) stream 和 parallelStream区别; 实现一个阻塞队列(用Condition写生产者与消费者就)?BlockingQueue

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值