Основные проблемы с sorter()
состоят в том, что (1) он не вернется, пока не вернется функция потока, и (2) функцией потока будет sorter()
, поэтому у вас есть неопределенный цикл.Это, вероятно, проблема с попыткой абстрагировать ваш код в вопрос.Есть мелкие детали, которые нужно исправить, такие как типы функций и т. Д.
Проблемы с network()
могут быть похожими или разными;Вы не показали функцию, которую вызываете из main()
, поэтому неясно, что вы собираетесь.Код в networker()
не хорош;pthread_create()
вызывает функцию с неверной подписью - функции потока должны иметь подпись void *function(void *arg);
.
Однако, как правило, нет проблем с запуском разных потоков в коде из разных исходных файлов.Если потоки не отсоединены - если вы собираетесь присоединиться к ним - тогда вам нужно сделать pthread_t
инициализированным pthread_create()
доступным для кода, который управляет присоединением - возможно, потому что они находятся в глобальных переменных иличасть глобального массива или, возможно, потому что вы предоставляете функциональный доступ к частным данным, хранящимся в отдельных исходных файлах.
Итак, вы можете иметь:
network.c
static pthread_t thread2;
static void *network_thread(void *arg);
void network(void)
{
if (pthread_create(&thread2, NULL, network_thread, NULL) != 0)
…handle error…
}
void network_join(void)
{
void *vp = 0;
if (pthread_join(&thread2, &vp) != 0)
…report error…
…maybe use the return value in vp…
}
sorter.c
static pthread_t thread1;
static void *sorter_thread(void *arg);
void sorter(void)
{
if (pthread_create(&thread1, NULL, sorter_thread, NULL) != 0)
…handle error…
}
void sorter_join(void)
{
void *vp = 0;
if (pthread_join(&thread1, &vp) != 0)
…handle error…
…maybe use value in vp…
}
main.c
#include "sorter.h"
#include "network.h"
int main(void)
{
network();
sorter();
network_join();
sorter_join();
return 0;
}
Возможно, вы построите проверкив network_join()
и sorter_join()
, так что если вы еще не вызвали network()
или sorter()
, код не будет пытаться присоединиться к неверному потоку.