Pthread

No fragmento de código abaixo, o tipo pthread_t cria uma variavel para uma Thread

A função pthread_create() é utilizada para inicializar um thread. Para isso, a função recebe como argumento o endereço de um dado pthread_t que será inicializado.

A função pthread_join finaliza uma thread que esta em execução. A função pthread_join recebe como argumentos a estrutura de controle do thread, do tipo pthread_t, que será finalizado e o endereço de um ponteiro (void **) para o valor de retorno do thread.

Este codigo tambem possui o uso da função fork(), que é usado para criar processos. Ele cria uma processo (pid_t pid = fork();), faz a verificação, caso seja filho, executa uma ação, depois volta ao processo que o criou por meio da função exit(), no qual verifica qual processo retournou, por meio da função waitpid(). Depois disso, ele verifica o status do retorno, por meio de WIFEXITED(), caso o retorno seja bem sucedido, ele pega o resultado do retorno WEXITSTATUS(ret)

Arquivo: Clementine/3rdparty/google-breakpad/client/mac/tests/minidump_generator_test.cc


.
.
.
TEST_F(MinidumpGeneratorTest, InProcess){
    MinidumpGenerator generator;
    string dump_filename = MinidumpGenerator::UniqueNameInDirectory(tempDir.path,NULL);
    pthread_t junk_thread;
    bool quit = false;
    ASSERT_EQ(0, pthread_create(&junk_thread, NULL, Junk, &quit));
    ASSERT_TRUE(generator.Write(dump_filename.c_str()));
    struct stat st;
    ASSERT_EQ(0, stat(dump_filename.c_str(), &st));
    ASSERT_LT(0, st.st_size);
    quit = true;
    pthread_join(junk_thread, NULL);
    .
    .
    .
}
TEST_F(MinidumpGeneratorTest, OutOfProcess) {
    const int kTimeoutMs = 2000;
    char machPortName[128];
    sprintf(machPortName, "MinidumpGeneratorTest.OutOfProcess.%d", getpid());
    ReceivePort parent_recv_port(machPortName);
    int fds[2];
    ASSERT_EQ(0, pipe(fds));
    pid_t pid = fork();
    if (pid == 0) {
        close(fds[1]);
        MachSendMessage child_message(0);
        child_message.AddDescriptor(mach_task_self());
        MachPortSender child_sender(machPortName);
        if (child_sender.SendMessage(child_message, kTimeoutMs) != KERN_SUCCESS) {
            fprintf(stderr, "Error sending message from child process!\n");
            exit(1);
        }
        uint8_t data;
        read(fds[0], &data, 1);
        exit(0);
    }
    .
    .
    .
    int ret;
    ASSERT_EQ(pid, waitpid(pid, &ret, 0));
    EXPECT_NE(0, WIFEXITED(ret));
    EXPECT_EQ(0, WEXITSTATUS(ret));
    .
    .
    .
}