C программа застряла, не входит в основной ()

Вы можете использовать мой контейнер [y0] AsyncContainer IoC, который поддерживает тот же самый сценарий, что и вы.

Он также поддерживает другие удобные сценарии, такие как инициализаторы асинхронизации, условные фабрики времени выполнения, зависят от асинхронных и синхронных заводских функций

//The email service factory is an async method
public static async Task<EmailService> EmailServiceFactory() 
{
  await Task.Delay(1000);
  return new EmailService();
}

class Service
{
     //Constructor dependencies will be solved asynchronously:
     public Service(IEmailService email)
     {
     }
} 

var container = new Container();
//Register an async factory:
container.Register<IEmailService>(EmailServiceFactory);

//Asynchronous GetInstance:
var service = await container.GetInstanceAsync<Service>();

//Safe synchronous, will fail if the solving path is not fully synchronous:
var service = container.GetInstance<Service>();
0
задан Zuzana Klinovska 7 March 2019 в 08:47
поделиться

2 ответа

Вы ничего не видите на терминале из-за опечатки в выводе printf("main/n");

printf не сбрасывается в stdout и созданные потоки потребляют цикл навсегда, или, по крайней мере, в течение длительного времени.

Вы должны добавить fflush(stdout); после оператора printf, чтобы проверить это.

Затем вы можете попробовать printf("main\n"); без fflush() проверить, что stdout буферизована строкой, то есть: вывод сбрасывается на терминал, когда выводится новая строка.

Если вы перенаправляете вывод в файл, stdout обычно полностью буферизуется, поэтому вы должны добавить явное fflush(stdout); после каждой операции вывода, чтобы вы могли видеть результат в выходном файле на лету или после убийства программы. .

Обратите внимание, что для большинства пользователей код будет легче читать, если вы используете английские слова для идентификаторов, типов, комментариев и сообщений.

0
ответ дан chqrlie 7 March 2019 в 08:47
поделиться

У вас есть очевидная опечатка в вашем printf("main/n");, а не printf("main\n"); (или просто puts("main");), но это деталь, а не причина, по которой ваша программа никогда не завершит

в vlakno1 вы создаете тупик, выполняя:

    if(poc_precitanych == 0){
        pthread_exit(NULL);
    }

, потому что вы не разблокируете мьютекст, должно быть

    if(poc_precitanych == 0){
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
    }

у вас та же проблема в vlakno2 [1117 ]:

    if(pocet_pisanych == 0){
        pthread_exit(NULL);
    }

должно быть

    if(pocet_pisanych == 0){
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
    }

Следующее также странно:

    pocet_pisanych = fwrite(a, sizeof(char),poc_precitanych, stdout);

    if(pocet_pisanych == 0){
        pthread_exit(NULL);
    }

даже это не невозможно, трудно иметь запись на stdou безуспешно. Таким образом, единственный шанс для вас выйти из этого цикла - получить poc_precitanych со значением 0

Дополнительное замечание, вы #define V 300, но вы делаете char a[300];, пока используете V в другом месте. Лучше сделать char a[V]; или использовать sizeof(a) в другом месте без определения V


Примеры выполнения после изменений:

/tmp % ./a.out < /dev/null
main
vlakno 1vlakno 2

читать нечего, поэтому poc_precitanych значения 0 и два потока заканчиваются, но

/tmp % echo "1 2 3" | ./a.out
main
vlakno 1vlakno 1vlakno 21 2 3
^C
0
ответ дан bruno 7 March 2019 в 08:47
поделиться
Другие вопросы по тегам:

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