Многопоточный сервер C ++ - PullRequest
0 голосов
/ 04 июня 2019

В настоящее время я пытаюсь узнать больше о серверной библиотеке libevent .

Я натолкнулся на этот пример программы, запускаемой после загрузки библиотеки libevent , которую я запустилс main as:

main.cpp

#include <winsock2.h>
#include <windows.h>
#include<stdio.h>
#include <csignal>
#include <condition_variable>
#include "HttpServer.h"

#pragma comment(lib,"WS2_32")

std::mutex m;
std::condition_variable cv;

void signalHandler(int signum) 
{
    cv.notify_all();
}

void onHello(CHttpRequest *req, void *arg) 
{
    char *data = "<html><body><center><h1>Hello World </h1></center></body></html>";
    req->AddBufferOut(data, strlen(data));
    req->SendReply(HTTP_OK);
}

int main(int argc, char** argv)
{
    WORD wVersionRequested;
    WSADATA wsaData;

    wVersionRequested = MAKEWORD(2, 2);
    WSAStartup(wVersionRequested, &wsaData);

    signal(SIGINT, signalHandler);
    signal(SIGTERM, signalHandler);
    CHttpServer server("127.0.0.1", 5555, 5); //Create five threads
    server.SetCallback("/hello", onHello, NULL);
    server.Start();
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk);
    return 0;
}

5 потоков создаются в этом, передавая CHttpServer server("127.0.0.1", 5555, 5);.Я добавил Sleep в void CHttpRequest::AddBufferOut(const char* data, size_t len) из 5 секунд, как показано ниже:

evbuffer_add(evhttp_request_get_output_buffer(this->req), data, len);
std::this_thread::sleep_for(std::chrono::milliseconds(5000)); // In place of  "evthread_use_pthreads" replaced with "evthread_use_windows_threads" 

текст консоли

Thread-id created in Lambda Expression  ----->     1696
Thread-id created in Lambda Expression  ----->     3008
Thread-id created in Lambda Expression  ----->     4464
Thread-id created in Lambda Expression  ----->     5516
Thread-id created in Lambda Expression  ----->     1652
Sending Reply by Thread-id------> 3008
Sending Reply by Thread-id------> 5516
Sending Reply by Thread-id------> 1696
Sending Reply by Thread-id------> 4464
Sending Reply by Thread-id------> 1652
Sending Reply by Thread-id------> 3008
Sending Reply by Thread-id------> 3008
Sending Reply by Thread-id------> 3008
Sending Reply by Thread-id------> 3008
Sending Reply by Thread-id------> 3008

Первые пять запросов выполняются параллельно, но после этого все запросы назначаютсяк той же теме.Этот случай возникает, когда сон длится более 1 секунды, а не когда он менее одной секунды.Любая помощь будет оценена.Я использую Windows 7 VS 2015. Я передаю 10 запросов, используя JMeter, все запросы достигают сразу.Он печатает только «Hello world» в сети «http://127.0.0.1:5555/hello", поэтому время, затрачиваемое на это, невелико. Вы можете поделиться своим опытом с подобной ошибкой, даже если она встречалась в разных программах и мерах, которые вы предприняли.

...