一:创建一个简单的线程
#include<stdio.h>
#include<sys/types.h>
#include<pthread.h>
int data;
void sub1(void)
{
data+=1;
printf("SubThread-->data=%d\n",data);
}
int main(void)
{
data =4;
pthread_t pthread1;
pthread_create(&pthread1,NULL,(void*)sub1,NULL);
pthread_join(pthread1,NULL);
data+=1;
printf("MainThread-->data=%d\n",data);
return 0;
}
二:挂起线程——pthread_join
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void *thread(void *str)
{
int i;
for(int i=0;i<10;++i)
{
sleep(2);
printf("This is the thread:%d\n",i);
}
return NULL;
}
int main()
{
pthread_t pth;
long i;
long ret=pthread_create(&pth,NULL,thread,(void*)i);
for(i=0;i<10;++i)
{
sleep(1);
printf("This is the main:%ld\n",i);
}
return 0;
}
1:不挂起的时候
2:挂起的时候
三:多线程加速
即:单线程,双线程,n*n线程打印矩阵,比较时间
多线程加速代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<pthread.h>
pthread_t thid[1000][1000];
pthread_t tid[2];
int pass[1000][1000][2];
int n;
int a[1000][1000],b[1000][1000];
int result[1000][1000];
int result1[1000][1000];
void Thread1()
{
int i,j,m;
for(i=0;(i<n);i++)
for(j=0;j<n;j++)
for(m=0;m<n;m++)
{
if(i%2==0)
result[i][j]+=a[i][m]*b[m][j];
}
}
void Thread2()
{
int i,j,m;
for(i=0;(i<n);i++)
for(j=0;j<n;j++)
for(m=0;m<n;m++)
{
if(i%2!=0)
result[i][j]+=a[i][m]*b[m][j];
}
}
void Thread(int *p)
{
int row=p[0];
int col=p[1];
int res=0;
int l;
for(l=0;l<n;l++)
res+=a[row][l]*b[l][col];
result[row][col]=res;
}
int main()
{
int i,j,m;
double start1,finish1;
double start2,finish2;
double start3,finish3;
int r;
printf("请输入矩阵阶数(1~1000) n=");
scanf("%d",&n);
printf("----------------------------\n");
srand((unsigned) time(NULL));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
a[i][j]=rand()%11;
b[i][j]=rand()%11;
}
printf("数组a:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("-----------------------------\n数组b:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",b[i][j]);
}
printf("\n");
}
start1=clock();
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
pass[i][j][0]=i;
pass[i][j][1]=j;
r=pthread_create(&thid[i][j],NULL,(void*)Thread,pass[i][j]);
pthread_join(thid[i][j],NULL);
}
finish1=clock();
start3=clock();
pthread_create(&tid[0],NULL,(void*)Thread1,NULL);
pthread_join(tid[0],NULL);
pthread_create(&tid[1],NULL,(void*)Thread2,NULL);
pthread_join(tid[1],NULL);
finish3=clock();
start2=clock();
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(m=0;m<n;m++)
result[i][j]+=a[i][m]*b[m][j];
finish2=clock();
/---------------------输出相乘计算结果-----------------------
printf("计算结果:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",result[i][j]);
}
printf("\n");
}
printf("------------------------------------------\n");
printf("矩阵阶数 :%d\n",n);
printf("Single Thread calculate time is %g\n",(finish2-start2));
printf("n*n Mutli Thread calculate time is %g\n",(finish1-start1));
printf("2 Thread calculate time is %g\n",(finish3-start3));
return 0;
}
1:10阶乘矩阵结果
2:100阶乘矩阵
3:1000阶乘矩阵
四:linux中pthread编译指令
gcc -o 1 1.c -lpthread
|