でスレッドを作成するとき、即時pthread_create
を配置する必要がありますか?pthread_join
たとえば、次の 2 つのコードがありますが、なぜ機能しないのかわかりません。
最初のバージョンでは、出力は確定的ではありません。
#include<iostream>
#include<pthread.h>
#include<cstring>
#include<cstdlib>
#define ROW 3
#define COL 3
using namespace std;
typedef struct {
int row;
int col;
} para;
void print(double * para)
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cout<<*(para+3*i+j)<<"\t";
}
cout<<endl;
}
}
double mat[9]={1,2,3,4,5,6,7,8,9};
double * result=(double *) malloc(9*sizeof(double));
void * mul(void * arg)
{
para * temp=(para *) arg;
int row=temp->row;
int col=temp->col;
double sum=0;
for(int i=0;i<3;i++)
{
double a=*(mat+row*3+i);
double b=*(mat+i+3*col);
sum+=a*b;
}
*(result+row*3+col)=sum;
int main()
{
pthread_t thread[9];
for(int i=0;i<9;i++)
{
para M;
M.row=i/3;
M.col=i%3;
pthread_create(&thread[i],NULL,mul,&M);
}
for(int i=0;i<9;i++)
{
pthread_join(thread[i],NULL);
}
print(result);
}
2番目のバージョンでは、出力は正しいです。
#include<iostream>
#include<pthread.h>
#include<cstring>
#include<cstdlib>
#define ROW 3
#define COL 3
using namespace std;
typedef struct {
int row;
int col;
} para;
void print(double * para)
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cout<<*(para+3*i+j)<<"\t";
}
cout<<endl;
}
}
double mat[9]={1,2,3,4,5,6,7,8,9};
double * result=(double *) malloc(9*sizeof(double));
void * mul(void * arg)
{
para * temp=(para *) arg;
int row=temp->row;
int col=temp->col;
double sum=0;
for(int i=0;i<3;i++)
{
double a=*(mat+row*3+i);
double b=*(mat+i+3*col);
sum+=a*b;
}
*(result+row*3+col)=sum;
int main()
{
pthread_t thread[9];
for(int i=0;i<9;i++)
{
para M;
M.row=i/3;
M.col=i%3;
pthread_create(&thread[i],NULL,mul,&M);
pthread_join(thread[i],NULL);
}
print(result);
}
これら2つの使用法の違いは何ですか? そして、最初のコードに何か問題があるのはなぜですか?