记录一个多线程运行速度的问题(未解决)

两盒软妹~` 提交于 2020-01-11 18:07:18

待解决问题:同一进程的多线程与cpu多核心的关系,是否在同一核心运行,以及什么条件下可以在不同核心运行?

1.问题背景
最近在公司做一个斗地主游戏牌库的设计,需要满足炸弹分布和最少出牌手数的限制,例如“112,3”表示第一个玩家1个炸弹,第二个玩家1个炸弹,第三个玩家两个炸弹,并且除炸弹以外的牌需要在3手以内出完。经过分析后,只有顺子和飞机与牌的点数有关,其他任何组合与牌点无关,是固定值,因此考虑dfs+dp的的算法进行搜索。自认为算法设计没问题,但是还想继续优化速度,因此考虑并行行计算的方式,之前项目中用到的多线程方面的也挺多,但是从没考虑过效率的问题。两个线程在共享同一变量和不共享同一变量时,运行速度差距很大。下面列出代码和各种效率问题,记录一下,后续再研究。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include <boost/thread/thread.hpp>

using namespace std;
int dp[25][25][25][25],card[15],h[15];
int test;

int allTime;
int allTime1;

void fun()
{
    //1000000000
    for(int i=0;i<1000000000;i++)
    {
        double a = 3/2*4*5/2*4*4*4*5;
        double k = sqrt(a);
        double aa = sqrt(k);
        test++;
        allTime++;
    }
}
void fun1()
{
    //1000000000
    for(int i=0;i<1000000000;i++)
    {
        double a = 3/2*4*5/2*4*4*4*5;
        double k = sqrt(a);
        double aa = sqrt(k);
        test++;
        allTime1++;
    }
}

int main( int size, vector<int> arr)
{
    test = 0;
    allTime = 0;
    allTime1 = 0;
    boost::thread_group threads;
    
    clock_t start =clock();		//程序开始计时
    threads.create_thread(fun);
    threads.create_thread(fun1);
    threads.join_all();
    clock_t end=clock();		//程序结束用时
    double endtime=(double)(end-start)/CLOCKS_PER_SEC;
    cout<<"Total time:"<<endtime<<endl;
    
    system("pause");

    return 0;
}

各种情况以及对应的运行时间:

fun中test条件 执行时间
单线程,test++ 13.3
单线程,无test++ 13.3
双线,无test++ 12.8
双线,test = 1 47
双线,test = 1 test =2 49
双线,test = 10000000000 49
双线,test = 1,test++ 49
双线,test++ 71

根据上表的结果分析:在不共享资源的情况下,或者共享资源没有写操作的时候,单线程与双线程执行时间基本一样,但是在双线程共享一个变量,并且写变量的时候 ,运行速度下降特别多。

思考猜测:两个线程没有同时写操作一个资源时,应该是被分配在cpu的不同核心进行工作,但是同时写操作一个资源时,是在cpu的同一核心进行工作,需要不停的进行线程切换,所以速度并不是翻倍下降,而是下降很多。

上述问题还仅仅是猜测,平时使用多线程时,只停留在用的阶段上,对于cpu是如何调度线程的,线程之间的各种关系没有深入了解,后面查阅清楚了再来补充。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!