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));
.
.
.
}