Как заставить pthreads работать одновременно без pthread_join () - PullRequest
0 голосов
/ 29 мая 2020

Я делаю программу, в которой у меня одновременно работают несколько потоков. После того, как я некоторое время возился с кодом, у меня возникла проблема, когда я отправлял строку (char *) в поток для дальнейших операций, и почему-то строка вообще не отправлялась.

Позже , Я написал очень простой код, в котором я просто отправляю строку в поток, а функция выводит ее на консоль. Я обнаружил, что без использования pthread_join() это вообще не сработает. Я понятия не имею, почему, потому что я знаю, что всякий раз, когда вызывается pthread_join(), он блокирует каждый другой поток и ждет, пока он не завершится.

Вот простая программа:

void* prisntstr(void* string);

int main(int argc, char *argv[])
{
    char* string = "Hello!";

    pthread_t thread;

    pthread_create(&thread, NULL, prisntstr, (void*)string);

    pthread_join(thread, NULL);

}

void* prisntstr(void* string)
{
    char* str = (char*)string;

    printf("%s\n", str);
}

Кто-нибудь знает, как это сделать без использования pthread_join()?

Ответы [ 3 ]

2 голосов
/ 30 мая 2020

Проблема с вашей программой, если вы удалите pthread_join, состоит в том, что main возвращается и тем самым заставляет программу завершиться без каких-либо действий для синхронизации с другим потоком и определения, действительно ли она завершена. Когда возвращается main, это как если бы вы вызвали exit, и весь процесс завершился.

Помимо pthread_join, есть много способов заставить main дождаться выполнения других действий. законченный. Вы можете подождать семафор, который отправят другие потоки, вы можете l oop в переменной условия, проверяющей данные, установленные другими потоками, et c.

В качестве альтернативы вы можете main call pthread_exit чтобы завершить начальный поток. Тогда процесс не завершится, пока вы не вызовете exit или пока каждый поток не завершится.

1 голос
/ 30 мая 2020

Поток, вызывающий pthread_join(), просто ждет, пока другой поток завершит sh. Обратите внимание, что:

Если этот поток уже завершен, то pthread_join() немедленно возвращается

Это самый элегантный способ сделать это, остальные более сложные. , и с использованием IP C tecniques:

  • вызывающий поток может ждать мьютекса / семафора, помещенного вторичным потоком
  • вызывающий поток может ждать сигнала, отправленного вторичный поток
  • ... и так далее

Итак, в основном стратегия: синхронизировать потоки, чтобы

  1. Основной поток мог получить некоторую информацию вычислено дочерним потоком
  2. Процесс сохраняется до тех пор, пока дочерний поток не завершит свое действие (как в этом случае)

Причина, по которой без pthread_join() вы не увидите, что сообщение, выводимое на стандартный вывод, состоит в том, что как только основной завершается, он завершает весь процесс и все дочерние потоки завершаются ; в вашем случае до выполнения печати. ​​

0 голосов
/ 30 мая 2020
  • Когда вы используете поток в своей программе, созданный поток станет дочерним потоком, а основная программа станет основным потоком. Итак, нам нужно заблокировать основной поток, чтобы он не мог закрыться.

  • Если основной поток закрыт, дочерние потоки также будут завершены. Итак, вам нужно найти способ заблокировать основной поток, чтобы он не выходил. thread дает нам возможность для этого - pthread_join (). Это заблокирует основной поток, пока дочерний поток не заработает. Основной поток будет заблокирован на строке pthread_join (). Он не будет выполнять другие строки.

  • Если вы не хотите использовать pthread_join (), вам нужно найти другие способы для этого.

Ex:

while(1);
  • а (1); не завершит основной поток, пока вы не завершите процесс.
...