我最近在学习线程。在一个小实验中,我使用pthread尝试多线程来计算两个矩阵的乘积。然后我发现使用多线程花费的时间比不花费更多。我试图扩大矩阵的体积,单线程只是表现更好。 这是我的测试代码和结果: 单线程:
#include <stdio.h>
#include <pthread.h>
#include <sys/time.h>
#define M 3
#define K 2
#define N 3
int A[M][K]={{1,4},{2,5},{3,6}};
int B[K][N]={{8,7,6},{5,4,3}};
int C[M][N];
int main()
{
int begin = clock();
int result = 0;
int i,j,m;
for(i=0;i<M;i++)
for(j=0;j<N;j++){
for(m=0;m<K;m++){
result+=A[i][m]*B[m][j];
}
C[i][j]=result;
result = 0;
}
int end = clock();
printf("time cost:%d\n",end-begin);
for(i=0;i<M;i++){
for(j=0;j<N;j++){
printf("%d ", C[i][j]);
}
printf("\n");
}
}
结果:
时间成本:1
28 23 18
41 34 27
54 45 36
多线程:
#include <stdio.h>
#include <pthread.h>
#include <malloc.h>
#include <sys/time.h>
#define M 3
#define K 2
#define N 3
/*structure for passing data to thread*/
struct v
{
int i;
/*row*/
int j;
/*column*/
};
void create_and_pass(struct v *data);
void* runner(void *param);
int A[M][K]={{1,4},{2,5},{3,6}};
int B[K][N]={{8,7,6},{5,4,3}};
int C[M][N];
int main(int argc, char* argv[])
{
/*We have to create M*N worker threads*/
int begin = clock();
int i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++){
struct v *data = (struct v *)malloc(sizeof(struct v));
data->i=i;
data->j=j;
/*Now create the thread passing it data as a parameter*/
create_and_pass(data);
}
int end = clock();
printf("花费时间:%d\n",end-begin);
for(i=0;i<M;i++){
for(j=0;j<N;j++){
printf("%d ",C[i][j]);
}
printf("\n");
}
}
void create_and_pass(struct v *data)
{
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&tid,&attr,runner,(void *)data);
pthread_join(tid,NULL);
}
void* runner(void *param)
{
struct v *data = param;
int result = 0;
int m;
for(m=0;m<K;m++)
result+=A[data->i][m]*B[m][data->j];
C[data->i][data->j]=result;
}
结果:
时间成本:1163
28 23 18
41 34 27
54 45 36
请帮助,谢谢。
答案 0 :(得分:1)
主线程创建并启动工作线程,并立即加入它。连接是阻塞操作,这意味着在此完成之前不会启动任何其他线程。有效地执行是顺序的,具有内存分配,线程创建等的所有开销
您也不太可能在这么小的数据集上看到任何收益。