gpt4 book ai didi

c++ - 为什么在使用 pthread 的 Ubuntu 中单线程比多线程快?

转载 作者:太空狗 更新时间:2023-10-29 11:44:13 24 4
gpt4 key购买 nike

XUbuntu 14.04,2 个处理器。

多线程0.8s,单线程0.4s。

如果定义了MULTI_THREAD,那么程序将在单线程中运行。否则就是多线程程序

怎么了?

 ----------------code------------------------------

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

#define MULTI_THREAD
#define NUM 10000
#define SEM_M 10
int arr[NUM];
FILE *f;

typedef struct _SemData{
sem_t sem_full;
sem_t sem_empty;
}SemData;

void InitSemData(SemData *sd){
sem_init(&sd->sem_full,0,0);
sem_init(&sd->sem_empty,0,SEM_M);
}

void DestroySemData(SemData *sd){

sem_destroy(&sd->sem_full);
sem_destroy(&sd->sem_empty);
}

void *Produce(void* data){
#ifdef MULTI_THREAD
SemData* psd=(SemData*)data;
#endif
int i;
for(i=0;i<NUM;++i){
#ifdef MULTI_THREAD
sem_wait(&psd->sem_empty);
#endif
arr[i]=i;
fprintf(f,"produce:%d\n",arr[i]);
#ifdef MULTI_THREAD
sem_post(&psd->sem_full);
#endif
}
}

void *Custom(void* data){
#ifdef MULTI_THREAD
SemData* psd=(SemData*)data;
#endif
int i,j;
for(i=0;i<NUM;++i){
#ifdef MULTI_THREAD
sem_wait(&psd->sem_full);
#endif
int tmp=0;
for(j=0;j<NUM;++j){
tmp+=arr[i];
}
arr[i]=tmp;
fprintf(f,"Custom:%d\n",arr[i]);
#ifdef MULTI_THREAD
sem_post(&psd->sem_empty);
#endif
}
}

void main(){
f=fopen("b.txt","w");
clock_t start=clock();
#ifdef MULTI_THREAD
SemData sd;
InitSemData(&sd);

pthread_t th0,th1;
pthread_create(&th0,NULL,Produce,(void*)&sd);
pthread_create(&th1,NULL,Custom,(void*)&sd);

pthread_join(th0,NULL);
pthread_join(th1,NULL);

DestroySemData(&sd);
#else
Produce(NULL);
Custom(NULL);
#endif
printf("TotalTime:%fs\n",((float)(clock()-start))/CLOCKS_PER_SEC);
fclose(f);
}

最佳答案

一般来说,并行化会带来额外的成本。您必须进行通信以分发和收集数据。此外,同步可能非常昂贵。

关于c++ - 为什么在使用 pthread 的 Ubuntu 中单线程比多线程快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27900204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com