Что я недавно заметил, пытаясь добавить некоторые многопоточные функциональные возможности в мой код для проекта на работе, так это то, что pthreads - огромная боль в заднице, чтобы иметь дело с логистикой ...
Вотсценарий ...
У меня есть бесконечный цикл в моем основном методе (сервере), порождающем потоки для обработки данных всякий раз, когда он получает пакет от любого клиента.Проблема в том, что я не могу заставить потоки выполняться одновременно.Они отказываются начинать выполнение до вызова pthread_join () из основного метода, который полностью убивает всю цель использования потоков в первую очередь (серверу нужно ОСТАНОВИТЬ поток выполнения и ждать, пока поток завершит обработку своих данных, прежде чем получитьбольше пакетов! смешно.)
Так есть ли способ использовать pthreads и действительно ли они многопоточные?Или мне лучше вообще не использовать потоки и сохранять дополнительные ресурсы, останавливая выполнение на моем сервере для вызова функции для обработки данных?
Я думаю, что мне, возможно, придется прибегать к разветвлению каждый раз ....
Это расстраивает ....
ниже приведен пример кода, который я сделал:
// gcc threads.c -lpthread
#include <stdio.h>
#include <pthread.h>
struct point{
int x, y;
};
static void *print_point(void *point_p);
int main() {
pthread_t tid;
struct point pt = {3, 5};
printf("enter main\n");
pthread_create(&tid, NULL, print_point, &pt);
while(1){continue;}
return 0;
}
static void *print_point(void *point_p) {
struct point arg = * (struct point *) point_p;
printf("Point: (%d, %d)\n", arg.x, arg.y);
return NULL;
}
когда я запускаю и компилирую это (да, я компилирую с -Переключатель lpthread), он печатает «enter main» и не выполняет поток ... Я даже позволил ему какое-то время работать (встал, пошел в ванную, съел немного еды), и все еще ничего.
Таким образом, поскольку основной метод порождает поток, а затем циклически повторяется, поток в конечном итоге должен выполняться ... верно?Из того, что я могу сказать из своих тестов, основной метод никогда не отдает выполнение потоку, который он породил.Единственный способ, которым я могу заставить его отказаться от него, вызвав join (но это лишает смысла иметь потоки, так как main будет ждать до завершения потока).