热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

文章来源:http:blog.csdn.netgreencactiarticledetails5881964最近在和朋友讨论的过程中,朋友说线程开得多性能好,理由是系统中

文章来源:http://blog.csdn.net/greencacti/article/details/5881964

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

最好起CPU核心数量*2 个线程
或者 CPU核心数量*2 +2 个线程

测试场景:

硬件: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
#include
#include

#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     {
        //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     {
        free(rangeArray[i]);
        rangeArray[i] = NULL;
    }

    //calculate the total number
    for(i=0; 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);
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。



推荐阅读
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 作者一直强调的一个概念叫做oneloopperthread,撇开多线程不谈,本篇博文将学习,怎么将传统的IO复用pollepoll封装到C++类中。1.IO复用复习使用p ... [详细]
  • 不知道你是否还记得之前在进程中的信号处理时,提到过阻塞信号集与未决信号集的概念,如果你已经忘记了,请参考《阻塞信号与未决信号》一文回忆一下 ... [详细]
  • 主要用的线程函数:1.创建线程:12intpthread_create(pthread_t*thread,constpthread_attr_ ... [详细]
  • Linux_多线程(进程与线程的联系_pthread库_线程创建_线程等待_线程正常终止_线程取消_线程分离_pthread_t与LWP)
    Linux_多线程(进程与线程的联系_pthread库_线程创建_线程等待_线程正常终止_线程取消_线程分离_pthread_t与LWP)-文章目录1.线程的定义,进程和线程 ... [详细]
  • 采用CreateThread()创建多线程程序
    本位转自:http:blog.csdn.netcbnotesarticledetails8277180在window环境下,Win32提供了一系列的AP ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • pthread_mutex_lockpthread_mutex_lock(pthread_mutex_t*mutex);intpthread_mutex_trylock(pthre ... [详细]
  • C语言编程gcc怎么生成静态库.a和动态库.so
    这篇文章将为大家详细讲解有关C语言编程gcc怎么生成静态库.a和动态库.so,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章 ... [详细]
  • 线程概念在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列指令序列”;一切进程至少都有一个执行线程;  进程  VS. 线程  ... [详细]
author-avatar
dghghjkk_952
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有