Существует ряд проблем с вашим кодом. Прежде всего, вам нужно объявить функцию конструктора для класса Test, и учитывая то, как вы использовали код, я бы поместил вызов pthread_create () внутри конструктора. Во-вторых, хотя pthread_create () принимает в качестве своего первого аргумента аргумент pthread_t *, это означает, что этот аргумент используется в качестве выходного параметра, и указатель должен указывать на фактическую память / переменную, где идентификатор потока для вновь созданного потока будет помещается.
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
static void* func(void*);
class Test
{
public:
pthread_t threadId;
Test() {
pthread_create(&threadId, NULL, func, NULL);
}
};
static void* func(void *arg)
{
printf("Thread function called\n");
}
int main()
{
Test();
}
В общем, когда вы делаете многопоточный код, вы также хотите убедиться, что потоки уничтожены, когда вы покончили с ними, или отследить, когда они умирают сами по себе. Например, если вы создаете «рабочий» поток, который будет использоваться для асинхронной обработки работы в фоновом режиме, вам часто понадобится очередь с защитой мьютекса, чтобы основной поток передавал работу рабочему потоку. Вы также часто хотели бы, чтобы какой-нибудь семафор или другая «безопасная» сигнальная система заставляла рабочий поток безопасно умирать, когда программа хочет выйти, с механизмом обратной сигнализации, чтобы основной поток знал, когда рабочий умер, и теперь это безопасно. очистить общие структуры данных. (то есть, помещая часть работы в очередь заданий, которая просто говорит «умри», и заставляя работника ответить «умирая» перед выходом)
Реализация правильного многопоточного кода нетривиальна, и вам нужно беспокоиться о широком спектре проблем, таких как тупиковая ситуация и условия гонки, которые просто не возникают с однопоточным кодом. Я настоятельно рекомендую вам прочитать и полностью понять эти и другие темы.