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

Pthread, чистый си, откуда ошибка сегментирования?

По некоторым причинам, я хочу использовать pthread в проекте. И мне необходимо, чтобы корутины работали параллельно и результат выводили также.
Код:
#include <pthread.h>
#include <stdio.h>

void sleep(double time){for(double i =0; i<time; i ++){};};

void* zapis_v_terminal(char *str, double time)
{
    for(int i = 0; i < 5; i++)
    {
        printf(str);
        sleep(time);
    }
    return NULL;
}



int main(void)
{
    pthread_t t1, t2;
    pthread_create(&t1, NULL, zapis_v_terminal("Perviy potok rabotaet\n", 100000000), NULL);
    pthread_detach(t1);

    pthread_create(&t2, NULL, zapis_v_terminal("Vtoroy ne ochen\n", 10000000), NULL);
    pthread_detach(t2);

    printf("Rabota zavershena uspeshno\n");
    return 0;
}


Вывод:
Perviy potok rabotaet
Perviy potok rabotaet
Perviy potok rabotaet
Perviy potok rabotaet
Perviy potok rabotaet
Vtoroy ne ochen
Ошибка сегментирования (образ памяти сброшен на диск)


P. S: Я в этой теме не разбираюсь, отдельное спасибо если напишите будут ли последствия использования одной переменной t вместо t1 и t2
  • Вопрос задан
  • 110 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Skillbox
    Профессия Разработчик С++
 с нуля + ИИ
    7 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++ расширенный
    12 месяцев
    Далее
Решения вопроса 1
@res2001
Developer, ex-admin
Потоки - это не корутины совсем.
Корутины выполняются в одном потоке, последовательно.
Потоки выполняются параллельно на многоядерной/многопроцессорной системе.

Ошибка у вас в вызове pthread_create. Нужно примерно так:
pthread_create(&t1, NULL, zapis_v_terminal, NULL);
Потоковая функция zapis_v_terminal() должна соответствовать сигнатуре. Посмотрите man pthread_create там это написано. Последний параметр pthread_create является аргументом потоковой функции. У вас там сейчас NULL. Обычно все же в потоки передают какую-то информацию, хотя в простейшем случае можно использовать глобальные переменные.

Вам не надо делать detach(), наоборот перед выходом из main делайте join() обоих потоков, т.е. дождитесь завершения потоков, только потом выходите из main().
Чаще всего detach() не требуется и даже вреден. Лишь в ограниченных случаях можно/нужно использовать detach() потоки. Ваш случай не такой.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sergey-gornostaev
@sergey-gornostaev Куратор тега C
Седой и строгий
В pthread_create нужно передавать ссылку на функцию, а не результат её выполнения. Функция zapis_v_terminal возвращает NULL, функция pthread_create передаёт управление на нулевой указатель, естественно, возникает ошибка сегментирования.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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