Задать вопрос
@LosGnidoS

Что такое поток в Linux (pthread_create())?

Данная программа должна выводить в консоль "Hello World" "2007"

Создал структуру для передачи аргументов в потоковую функцию. Здесь вроде бы все нормально. Не вижу очевидных препятствий выводу текста в консоль, но, тем не менее это не происходит. Буду признателен, если укажите на ошибку или недочет. Буду рад любому совету или пояснению.

Кроме того, я не особо понимаю абстракцию потока. С одной стороны, мне понятно, что это инструмент, позволяющий повысить производительность процессора. Потоки позволяют в рамках одной программы выполнять одновременно несколько действий, используя при этом общие данные. В Linux потоки выполняются так же, как и процессы, т. е. независимо. Вопрос: зачем в одной и той же программе выполнять несколько действий посредтсвом потоков, когда по сути программа может делать это все сама без помощи потоков.В чем их реальный, приклданой смысл потоков??? каким имеено образом они работают и в каких отношениях состоят с процессом? Имею представление о стандартных потоках вывода, ввода и ошибки(stdout, stdin, stderr), но, не понимаю , одно ли это и то же, что я создаю поток с помощью поточной функции и перенаправляю потоки с помощью(> >>, < <<).Разные ли это потоки ??? Еще раз: буду рад любому объяснению. Заранее спасибо за ответ.
#include <stdio.h>
#include <pthread.h>

struct thread_arg
{
    char * str;
    int num;
};

void * function (void * arg)
{
    struct thread_arg targ = *(struct thread_arg *) arg;
    fprintf (stderr, "str=%s\n", targ.str);
    fprintf (stderr, "num=%d\n", targ.num);
    return NULL;
}

int main (void)
{
    pthread_t thread;
    int result;
    struct thread_arg targ;
    targ.str = "Hello World";
    targ.num = 2007;

    result = pthread_create (&thread, NULL, &function, &targ);

    
    return 0;
}
  • Вопрос задан
  • 603 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
@res2001
Developer, ex-admin
У вас программа завершается раньше, чем успевает отработать поток (вывести на экран информацию). После завершения основного потока (функция main) весь процесс завершается, в т.ч. и запущенные потоки.
Для исправления ошибки вам нужно в main() после старта потока подождать окончания его выполнения: pthread_join(). Вообще выполнять join нужно для каждого "присоединенного" потока, а по умолчанию они все присоединенные.

Процесс - это контейнер для потоков. В каждом процесс есть минимум один поток - основной (main()). Планировщик операционной системы планирует потоки.
Для ОС запустить поток проще и дешевле (по ресурсам), чем запустить процесс.

Потоки позволяют какие-то задачи в вашей программе решать параллельно. Это примерно то же самое, что и запустить второй процесс для решения части задачи. Но у двух процессов разные адресные пространства, а у потоков одно. Из-за этого обмен данными между потоками гораздо проще, чем между процессами. Но, конечно, и тут есть подводные камни - гонки данных и другие связанные проблемы.

stdin и прочие потоки ввода/вывода - это совсем другая сущность - это потоки данных.
pthread_create() - создает поток выполнения. Ощутите разницу!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы