Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Здравствуйте. Не удается передать класс для работы с 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, 17:10   #2
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 528
Репутация: 107
По умолчанию

Указатель
Код:

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, 18:02   #3
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 41
Репутация: 10
По умолчанию

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

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транспонирование множества данных из разных книгах или из разных листов на 1 лист посредством макроса Тантана Microsoft Office Excel 6 18.12.2014 14: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 08:12
подключение двух компьютеров к интернет через одно подключение Chudo4258 Помощь студентам 3 30.03.2010 16:07




18:40.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru