C++ pthread create and join
#include <stdlib.h> #include <stdio.h> #include <uuid/uuid.h> #include <time.h> #include <sstream> #include <stack> #include <iostream> #include <string.h> #include <csignal> #include <unistd.h> #include <pthread.h> using namespace std; void pThread14(); struct BookStruct { int Id; char *Name; char *Title; }; void *pStruct(void *structP); int main() { pThread14(); return 0; } void pThread14() { pthread_t arr[10]; int rc,i; for(i=0;i<10;i++) { cout<<"main():creating thread,"<<i<<endl; struct BookStruct bs; bs.Id=i*i; bs.Name=(char*)malloc(40); bs.Title=(char*)malloc(40); retrieveUuid1(bs.Name); retrieveUuid1(bs.Title); rc=pthread_create(&arr[i],NULL,pStruct,&bs); if(rc) { cout<<"Error:unable to create thread,"<<rc<<endl; exit(-1); } pthread_join(arr[i],NULL); } pthread_exit(NULL); } void *pStruct(void *structP) { struct BookStruct *bs=(struct BookStruct*)structP; cout<<"Id="<<bs->Id<<",Name="<<bs->Name<<",Title="<<bs->Title<<endl; pthread_exit(NULL); }
Compile
g++ -g -std=c++2a -I. h1.cpp -o h1 -luuid -lpthread
Run ./h1
Another solution is with pthread_attr_t and status value;
pthread_attr_t attr; void *status; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_destroy(&attr);
#include <stdlib.h> #include <stdio.h> #include <uuid/uuid.h> #include <time.h> #include <sstream> #include <stack> #include <iostream> #include <string.h> #include <csignal> #include <unistd.h> #include <pthread.h> #include <cstdlib> struct BookStruct { int Id; char *Name; char *Title; }; void *pStruct(void *structP); void pthread15(); int main() { pthread15(); return 0; }
void pthread15()
{
int i, rc;
pthread_t arr[10];
pthread_attr_t attr;
void *status;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for (i = 0; i < 10; i++)
{
cout << "main():creating thread," << i << endl;
struct BookStruct bs;
bs.Id = i * i;
bs.Name = (char *)malloc(40);
bs.Title = (char *)malloc(40);
retrieveUuid1(bs.Name);
retrieveUuid1(bs.Title);
rc = pthread_create(&arr[i], &attr, pStruct, &bs);
if (rc)
{
cout << "Error:unable to create thread," << rc << endl;
exit(-1);
}
rc = pthread_join(arr[i], &status);
if (rc)
{
cout << "Error:unable to join," << rc << endl;
exit(-1);
}
cout << "Main:completed thread id:" << i << ",exiting with status:" << status << endl;
}
//free attribute and wait for the other status
pthread_attr_destroy(&attr);
cout << "Main:program exiting." << endl;
pthread_exit(NULL);
}
Compile and run