Вы можете использовать мой контейнер [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>();
Вы ничего не видите на терминале из-за опечатки в выводе printf("main/n");
printf
не сбрасывается в stdout
и созданные потоки потребляют цикл навсегда, или, по крайней мере, в течение длительного времени.
Вы должны добавить fflush(stdout);
после оператора printf
, чтобы проверить это.
Затем вы можете попробовать printf("main\n");
без fflush()
проверить, что stdout
буферизована строкой, то есть: вывод сбрасывается на терминал, когда выводится новая строка.
Если вы перенаправляете вывод в файл, stdout
обычно полностью буферизуется, поэтому вы должны добавить явное fflush(stdout);
после каждой операции вывода, чтобы вы могли видеть результат в выходном файле на лету или после убийства программы. .
Обратите внимание, что для большинства пользователей код будет легче читать, если вы используете английские слова для идентификаторов, типов, комментариев и сообщений.
У вас есть очевидная опечатка в вашем 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