Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2017, 17:56   #1
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию Одно подключение к бд в разных потоках

Здравствуйте. Не удается передать класс для работы с mysql в поток. Выдает кучу ошибок.
Вот код:
Код:
class Server{
public:

	Server(){
		mysqli=new Mysqli("127.0.0.1", "root", "Donthategirl18", "cpp");

		sock=FCGX_OpenSocket(SOCKET_PATH, 20);
		for(int i=0; i<THREAD_COUNT; i++){
			flows[i]=thread(threads, ref(sock), ref(mysqli));
		}
	}

	~Server(){
		for(int i=0; i<THREAD_COUNT; i++){
			flows[i].join();
		}
	}

private:
	int sock;
	Mysqli *mysqli;
	thread flows[THREAD_COUNT];
};
Код:
void threads(const int &sock, Mysqli &mysqli){
	Mysqli_result *result;
	MYSQL_ROW row;
	Client *sout;
	FCGX_Request request;
	FCGX_InitRequest(&request, sock, 0);

	while(true){
		static pthread_mutex_t accept_mutex=PTHREAD_MUTEX_INITIALIZER;

		//попробовать получить новый запрос
		pthread_mutex_lock(&accept_mutex);
		FCGX_Accept_r(&request);
		pthread_mutex_unlock(&accept_mutex);

		//получить значение переменной
		sout=new Client(request);
		FCGX_PutS("Content-type: text/html; charset=UTF-8\r\n", request.out);
		FCGX_PutS("\r\n", request.out);

		FCGX_PutS("<html>", request.out);
		FCGX_PutS("<head>", request.out);
		FCGX_PutS("<title>FastCGI</title>", request.out);
		FCGX_PutS("</head>", request.out);
		FCGX_PutS("<body>", request.out);
		FCGX_PutS("<p>Метод - ", request.out);
		FCGX_PutS(sout->method.c_str(), request.out);
		FCGX_PutS("</p>", request.out);
		FCGX_PutS("<p>Хост - ", request.out);
		FCGX_PutS(sout->host.c_str(), request.out);
		FCGX_PutS("</p>", request.out);
		FCGX_PutS("<p>IP-адрес - ", request.out);
		FCGX_PutS(sout->remote_addr.c_str(), request.out);
		FCGX_PutS("</p>", request.out);
		FCGX_PutS("<p>Запрос - ", request.out);
		FCGX_PutS(sout->uri.c_str(), request.out);
		FCGX_PutS("</p>", request.out);
		FCGX_PutS("<p>Куки - ", request.out);
		FCGX_PutS(sout->cookie.c_str(), request.out);
		FCGX_PutS("</p>", request.out);
		FCGX_PutS("<p>Время - ", request.out);
		FCGX_PutS(sout->tmp.c_str(), request.out);
		FCGX_PutS("</p>", request.out);
		FCGX_PutS("<form method=\"POST\"><input type=\"text\" name=\"test\"><input type=\"submit\"></form>", request.out);
		FCGX_PutS("</body>", request.out);
		FCGX_PutS("</html>", request.out);

		FCGX_Finish_r(&request);
		delete sout;
	}
}
Компилирую все этой
Цитата:
g++ -o index index.cpp -lpthread -lfcgi -I/usr/include/mysql -L/usr/lib/mysql -Lpath-to-the-mysql-library -lmysqlclient
командой
Андрей Цапко вне форума Ответить с цитированием
Старый 14.09.2017, 16:10   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Указатель
Код:
Mysqli *mysqli;
Ссылка
Код:
Mysqli &mysqli)
Из указателя получается ссылка путем разыменовывания

Код:
flows[i]=thread(threads, ref(sock), *mysqli);
С сокетом тоже фигня...там атомарный базовый тип, его просто, как копию передать стоит.
Ну и вообще само построение вот этого всего сильно пахнет тухлым. Нужно читать дословно доку по Mysqli и FCGX_PutS и смотреть, потоко ли это безопасно само по себе.

...мне кажется, вот это FCGX_Accept_r(&request); должно быть в главном потоке, а передавать в другие потоки уже рекуест....
...далее, гугл там намекнул, что FCGX_Accept_r может сигналы райзить типа SIG_PIPE. В многопоточной программе, сигналы нада перехватить и отработать особо (а лучше, чтоб их не было вообще).
К сожалению, не нагугли полной доки сходу, так что точнее хз.
alexzk вне форума Ответить с цитированием
Старый 14.09.2017, 17:02   #3
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию

Проблема с передачей Mysqli в поток уже решена. Заключалась она в том что перед функцией main у меня были описаны прототипы, которые я не менял и это не нравилось
на счет передачи ссылки на сокет это сделано специально. Сейчас я хочу передать объект содержащий дескриптор слушающего потому что он хранит много общих данных. На счет функции FCGX_Accept_r ничего сказать не могу. Это взято из какого то примера и функция относится к FastCGI. Пока с этим проблем не возникало, так что...

Последний раз редактировалось Андрей Цапко; 14.09.2017 в 17:08.
Андрей Цапко вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транспонирование множества данных из разных книгах или из разных листов на 1 лист посредством макроса Тантана Microsoft Office Excel 6 18.12.2014 13:04
Срабатывание разных макросов при изменении разных диапазонов на листе strannick Microsoft Office Excel 2 26.03.2012 18:28
Одно имя ячейки на разных листх Even Microsoft Office Excel 5 09.12.2011 13:26
Объединение данных из разных Файлов на разных листах одной книги Nikodim113 Microsoft Office Excel 20 12.01.2011 07:12
подключение двух компьютеров к интернет через одно подключение Chudo4258 Помощь студентам 3 30.03.2010 16:07