Можно ли создавать потоки в нескольких файлах для выполнения в основном файле? - PullRequest
0 голосов
/ 10 июня 2018

У меня есть следующая структура для взаимодействия с сортировщиком (бесконечный цикл) и сетевиком (бесконечный цикл) в двух отдельных потоках.Потоки создаются в каждом из их соответствующих файлов вместо основного файла.Есть ли какие-либо проблемы с этим?

main.c

int main(void {
   network();
   sorter();
}

sort.c // создает случайный массив, затем сортирует их в непрерывном цикле while (никогда не заканчивается)

void sorter() {
    int r1 = pthread_create(&thread1, NULL, (void *) &sorter, NULL);
    pthread_join(thread1, NULL);
}

int* getArray() { ... }
int getElement() { ... }

network.c

void network() {
   int r2 = pthread_create(&thread2, NULL, (void *) &startNetwork, NULL);
   pthread_join(thread2, NULL);
}

void startNetwork() {
  int sockfd, portno, optval, n;
  socklen_t adSize;
  struct sockaddr_in servAd, clientAd;
  ...
  while(1) { 
    //receive packet 
   int *arr = getArray();
   // send packets
   // or receive packet that has a command to get array 
  }

}

Можно ли так структурировать потоки?Будет ли мой основной файл зависать, потому что поток не создается в основном файле?Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Есть ли с этим проблемы?

Похоже, вы не понимаете, что делает pthread_join(thread1). ничего не делает , кроме как ждать, пока thread1 не закончится.Но вы сказали, что сетевой поток и поток сортировщика должны работать вечно, так что это будет долгое ожидание:


Для дальнейшего использования pthread_join() предназначено для использования следующим образом:

pthread_create(&thread1, attrs, f, arg);
doSomethingElse(...);
pthread_join(thread1, NULL);
doOtherStuff(...);

Исходный поток запускает новый поток, а затем делает что-то еще, пока новый поток вызывает f(arg).Затем, после того, как вызов f(arg) и вызов doSomethingElse(...) завершены, исходный поток переходит к doOtherStuff(...).

0 голосов
/ 10 июня 2018

Основные проблемы с 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(), код не будет пытаться присоединиться к неверному потоку.

...