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

原文地址:https://www.cnblogs.com/Fred1987/p/15672891.html