Russian Qt Forum
Май 01, 2024, 11:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 13 14 [15] 16 17   Вниз
  Печать  
Автор Тема: Igors, это ты? :)  (Прочитано 114887 раз)
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #210 : Декабрь 14, 2018, 13:45 »

Набросал вам пример с двумя таймерами, который работает в одном потоке.

теперь набросайте, что под капотом
Код:
timer.async_wait
могу исходники boost::asio скинуть, если нужно.
« Последнее редактирование: Декабрь 14, 2018, 13:50 от _Bers » Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #211 : Декабрь 14, 2018, 13:49 »

1.
ася то как раз мульти-поточная.
asio мультипоточная, когда вам надо, а когда не надо - однопоточная. Улыбающийся
что за бред?

2.
под капотом системного епула так же много-поточный дизайн.
Ну конечно, ядро современных ОС мультипоточны, поэтому абсолютно все программы являются мультипоточными (даже Hello world) - ну ок. Улыбающийся

не знаю откуда вы взягли своё "поэтому".
что за бред?


Я вам уже привел пример с uart, а еще есть прерывания, зеленые треды и т.д. Улыбающийся
не знаю, что такое "зеленые треды и тд"
прерывания - базис, посредством которого реализуется многопоточный дизайн.

я решил, не комментировать далее голословные бла бла бла.
Ну и правильно, сложно комментировать вещи о которых вы понятия не имеете. Улыбающийся

слишком жирно.

Новое поколение "специалистов", которые умеют нажать кнопочку в visual studio и дождаться появления окошка со своей прикладной программой. А что там в "компьютерах" происходит между нажатием и появлением считают магией. Улыбающийся
это ты про себя что ли?
не понятно, к чему был этот дешевый понт.

Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #212 : Декабрь 14, 2018, 13:53 »

теперь набросайте, что под капотом
Код:
timer.async_wait
могу исходники boost::asio скинуть, нужно.
Вы их сами посмотрите. Улыбающийся
А лучше скомпилируйте и посмотрите в отладчике сколько ниток запускается.

Только не нужно здесь лапотать, что ядро мультитредовое, поэтому и асинхронность примера - мультитредовая. Как выполняется пулинг в ядре исключительно детали реализации конкретного ядра. На железках без ОС пулинг легко может выполняться в том же потоке исполнения, что и бизнес логика.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #213 : Декабрь 14, 2018, 13:58 »

что за бред?
Вам это кажется бредом, потому что вы не знаете что там под капотом. Улыбающийся

не знаю откуда вы взягли своё "поэтому".
что за бред?
Вот и я удивляюсь, почему вы так думаете. Улыбающийся

прерывания - базис, посредством которого реализуется многопоточный дизайн.
По треду уже понятно, что у вас каша в голове. Улыбающийся

не понятно, к чему был этот дешевый понт.
Потому что, вы часто спорите о вещах, в которых не очень разбираетесь. Так... по вершкам прошлись у себя на вендо-десктопе и на основании этих узких познаний, спорите о фундаментальных понятиях.  Улыбающийся
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #214 : Декабрь 14, 2018, 14:00 »

Только не нужно здесь лапотать, что ядро мультитредовое, поэтому и асинхронность примера - мультитредовая. Как выполняется пулинг в ядре исключительно детали реализации конкретного ядра. На железках без ОС пулинг легко может выполняться в том же потоке исполнения, что и бизнес логика.
зачем же лапотать?

приведи пример асинхронного дизайна
для железки которая без ОС,
где пулинг выполняется в том же потоке исполнения,
что и бизнес логика.
« Последнее редактирование: Декабрь 14, 2018, 14:05 от _Bers » Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #215 : Декабрь 14, 2018, 14:05 »

что за бред?
Вам это кажется бредом, потому что вы не знаете что там под капотом. Улыбающийся

ты там выше писал:
"asio мультипоточная, когда вам надо, а когда не надо - однопоточная"

я спрашиваю: что за бред?
это никак не связанно с тем, что там у неё под капотом.


не знаю откуда вы взягли своё "поэтому".
что за бред?
Вот и я удивляюсь, почему вы так думаете. Улыбающийся

я не давал повода так думать.
ты пьяный что ли?


прерывания - базис, посредством которого реализуется многопоточный дизайн.
По треду уже понятно, что у вас каша в голове. Улыбающийся

оно и видно.
такое впечателние, что ты пьян.

не понятно, к чему был этот дешевый понт.
Потому что, вы часто спорите о вещах, в которых не очень разбираетесь. Так... по вершкам прошлись у себя на вендо-десктопе и на основании этих узких познаний, спорите о фундаментальных понятиях.  Улыбающийся

деццкий сад.

я, кстати, вообще никогда ни с кем не спорю,
если не имею с этого прямого профита (например - деньги)
ты бы это знал, если бы знал меня.

кстати, о вещах, в которых ты не разбираешься.

знаешь чем вообще синхронный вызов отличается от асинхронного?
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #216 : Декабрь 14, 2018, 14:10 »

приведи пример асинхронного дизайна
для железки которая без ОС,
где пулинг выполняется в том же потоке исполнения,
что и бизнес логика.
Поищите в интернете про Arduino и посмотрите как там это работает. Проще этого я даже не знаю что предложить. Улыбающийся
Но если не разберетесь, то приходите... будем обсуждать асинхронность. Улыбающийся
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #217 : Декабрь 14, 2018, 14:14 »

приведи пример асинхронного дизайна
для железки которая без ОС,
где пулинг выполняется в том же потоке исполнения,
что и бизнес логика.
Поищите в интернете про Arduino и посмотрите как там это работает. Проще этого я даже не знаю что предложить. Улыбающийся
Но если не разберетесь, то приходите... будем обсуждать асинхронность. Улыбающийся

я не хочу искать в интернете про Ардуино.
я хочу видеть твоё мнение.
твой пример-иллюстрацию.

пока что от тебя я видел только: "ты не прав".
ну так покажи, продемонстрируй как правильно.


Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #218 : Декабрь 14, 2018, 14:15 »

Поищите в интернете про Arduino и посмотрите как там это работает. Проще этого я даже не знаю что предложить. Улыбающийся

Там же будет имитация многопоточки, это же очевидно Улыбающийся.
Записан

Пока сам не сделаешь...
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #219 : Декабрь 14, 2018, 14:25 »

ты там выше писал:
"asio мультипоточная, когда вам надо, а когда не надо - однопоточная"

я спрашиваю: что за бред?
это никак не связанно с тем, что там у неё под капотом.
Попробую на пальцах... Улыбающийся
В asio вы сами (точнее мы сами Улыбающийся ) выбираем как запускать цикл обработки событий. Можем запустить io_context::run в основном потоке, можем запустить в разных, а можем даже запустить разные контексты в разных потоках.

я не давал повода так думать.
Да ладно, это вы здесь писали, что раз ОС многопоточная, значит вся асинхронщина в ней реализуется на ней.

ты пьяный что ли?
К сожалению нет, но тут алкоголь не поможет, здесь нужно дунуть. Улыбающийся
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #220 : Декабрь 14, 2018, 14:32 »

ты там выше писал:
"asio мультипоточная, когда вам надо, а когда не надо - однопоточная"

я спрашиваю: что за бред?
это никак не связанно с тем, что там у неё под капотом.
Попробую на пальцах... Улыбающийся
В asio вы сами (точнее мы сами Улыбающийся ) выбираем как запускать цикл обработки событий. Можем запустить io_context::run в основном потоке, можем запустить в разных, а можем даже запустить разные контексты в разных потоках.

и? какое отношение это имеет ко мне?
ты там выше вякнул, якобы я считаю, что , цитирую:
"asio мультипоточная, когда вам надо, а когда не надо - однопоточная"

вот это что за бред?
ты зачем мне приписываешь то, чего нет?


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

на людей напраслину наводишь.



Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #221 : Декабрь 14, 2018, 14:35 »

я хочу видеть твоё мнение.
твой пример-иллюстрацию.
А мне не хочется набирать бесполезный текст. Улыбающийся
Для чего сюда тащить примеры, коих кучи в интернете. Не хотите ардуинки, наберите пример использования select/epoll.
Вот нашел для вас первый попавшийся блог с примером epoll:
Код
C++ (Qt)
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <signal.h>
#include <iostream>
 
namespace
{
 
int setnonblocking(int sock);
void do_read(int fd);
void do_write(int fd);
void process_error(int fd);
 
}
 
int main(int argc, char* argv[])
{
const int MAX_EPOLL_EVENTS = 100;
const int BACK_LOG = 100;
 
if (argc < 2)
{
 std::cout <<  "Usage: server [port]" << std::endl;
 return 0;
}
 
char* p;
int serv_port = strtol(argv[1], &p, 10);
if (*p)
{
 std::cout << "Invalid port number" << std::endl;
 return -1;
}
 
// Игнорируем сигнал ошибки работы с сокетом
signal(SIGPIPE, SIG_IGN);
 
// Создание дескриптора epoll
int efd = epoll_create(MAX_EPOLL_EVENTS);
 
int listenfd;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd < 0)
{
 perror("Socket creation");
 return -1;
}
 
// Неблокирующий режим
setnonblocking(listenfd);
 
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(serv_port);
 
if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
{
 perror("Socket bind");
 return -1;
}
 
if (listen(listenfd, BACK_LOG) < 0)
{
 perror("Socket listen");
 return -1;
}
 
// Добавляем дескриптор в массив ожидания
struct epoll_event listenev;
listenev.events = EPOLLIN | EPOLLPRI | EPOLLET;
listenev.data.fd = listenfd;
if (epoll_ctl(efd, EPOLL_CTL_ADD, listenfd, &listenev) < 0)
{
 perror("Epoll fd add");
 return -1;
}
 
socklen_t client;
// Массив готовых дескрипторов
struct epoll_event events[MAX_EPOLL_EVENTS];
struct epoll_event connev;
struct sockaddr_in cliaddr;
 
int events_cout = 1;
 
for (;;)
{
 // Блокирование до готовности одно или нескольких дескрипторов
 int nfds = epoll_wait(efd, events, MAX_EPOLL_EVENTS, -1);
 
 for (int n = 0; n < nfds; ++n)
 {
  // Готов слушающий дескриптор
  if (events[n].data.fd == listenfd)
  {
   client = sizeof(cliaddr);
   int connfd = accept(listenfd, (struct sockaddr*) &cliaddr, &client);
   if (connfd < 0)
   {
    perror("accept");
    continue;
   }
 
   // Недостаточно места в массиве ожидания
   if (events_cout == MAX_EPOLL_EVENTS-1)
   {
    std::cout << "Event array is full" << std::endl;
    close(connfd);
    continue;
   }
 
   // Добавление клиентского дескриптора в массив ожидания
   setnonblocking(connfd);
   connev.data.fd = connfd;
   connev.events = EPOLLIN | EPOLLOUT | EPOLLET | EPOLLRDHUP;
   if (!epoll_ctl(efd, EPOLL_CTL_ADD, connfd, &connev) < 0)
   {
    perror("Epoll fd add");
    close(connfd);
    continue;
   }
 
   ++events_cout;
  }
  // Готов клиентский дескриптор
  else
  {
   // Выполням работу с дескриптором
   int fd = events[n].data.fd;
 
   if (events[n].events & EPOLLIN)
    do_read(fd);
 
   if (events[n].events & EPOLLOUT)
    do_write(fd);
 
   if (events[n].events & EPOLLRDHUP)
    process_error(fd);
 
   // В даннoм примере дескриптор просто закрывается и удаляется из массива ожидания.
   // В зависимости от логики работы можно не удалять дескриптор и подождать следующую порцию данных
   epoll_ctl(efd, EPOLL_CTL_DEL, fd, &connev);
   --events_cout;
   close(fd);
  }
 }
}
 
return 0;
}
 
namespace
{
 
int setnonblocking(int sock)
{
 int opts;
 
 opts = fcntl(sock,F_GETFL);
 if (opts < 0)
 {
  perror("fcntl(F_GETFL)");
  return -1;
 }
 opts = (opts | O_NONBLOCK);
 if (fcntl(sock,F_SETFL,opts) < 0)
 {
  perror("fcntl(F_SETFL)");
  return -1;
 }
 
 return 0;
}
 
void do_read(int fd)
{
 std::cout << "do_read" << std::endl;
}
 
void do_write(int fd)
{
 std::cout << "do_write" << std::endl;
}
 
void process_error(int fd)
{
 std::cout << "process_error" << std::endl;
}
}
 
Вот функции do_read, do_write, process_error будут вызываются асинхронно.
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #222 : Декабрь 14, 2018, 14:45 »

Вот функции do_read, do_write, process_error будут вызываются асинхронно.

у вас тут бизнес-логика в вечном цикле стопориться на блокирующем вызове:

Код:
 for (;;)
 {
  // Блокирование до готовности одно или нескольких дескрипторов
  int nfds = epoll_wait(efd, events, MAX_EPOLL_EVENTS, -1);

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

вы так и не ответили:
вы знаете чем различаются синхронный и асинхронный вызовы?
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #223 : Декабрь 14, 2018, 14:48 »

и? какое отношение это имеет ко мне?
ты там выше вякнул, якобы я считаю, что , цитирую:
"asio мультипоточная, когда вам надо, а когда не надо - однопоточная"

вот это что за бред?
ты зачем мне приписываешь то, чего нет?
Вы еще и читаете плохо или понимаете?
Это вы здесь утверждали, что asio исключительно мультитредовая, я вас поправил, что это не так. asio прекрасно умеет работать в одном потоке, и даже привел компилябельный пример с таймерами. Улыбающийся

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

на людей напраслину наводишь.

Так вот же:
Да, поток засыпает на системном вызове, передавая управление ядру.
и о боже, это и есть многопоточка, Карл!

Вы считаете системный вызов - многопоточкой. Почему, не знаю.

И здесь:

а асинхронный ввод/вывод конечно же реализуется не на многопоточке, да?
Конечно нет, она реализуется на эвентлупе (select/poll/epoll/kqueue)
которые реализуются за счет многопоточки. Карл.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #224 : Декабрь 14, 2018, 14:54 »

зачем вы приводите в качестве примера блокирующую функцию,
для примера иллюстрации асинхронного дизайна?
Это первый попавшийся блог. Считайте что там вместо -1 -> 0, и в цикле обрабатываются события бизнес-логики.
К демонстрации асинхронных операций чтения/записи это отношение не имеет.

вы знаете чем различаются синхронный и асинхронный вызовы?
Я то знаю. Улыбающийся
Записан
Страниц: 1 ... 13 14 [15] 16 17   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.108 секунд. Запросов: 22.