.................
while( true ) {
// Listening ...
cout << "Listening for Connections" << endl;
listen( sockHandle, 10 );
// Accepting ...
clientSockHandle = accept(sockHandle, (struct sockaddr *) &client_addr, &clientSockLen);
cout << "Client connected: " << inet_ntoa( client_addr.sin_addr ) << endl;
// Here I need to create a thread for client/server chating
if (clientSockHandle < 0)
cout << "ERROR on accept" << endl;
else {
pthread_t t_id;
pthread_create( &t_id, NULL, &threadCallback, (void*)clientSockHandle );
}
}
.................
cout как критическая секция, и доступ родительского/дочернего потоков
Имеется программа, в которой основной поток создаёт N дочерних потоков.
Вопрос - как реализовать совместный доступ к выводу текста в консоль для всех потооков (поочерёдный доступ). Само использование семафоров/мьютексов - это понятно. Вопрос в том, как заставить основной поток "открыть" доступ в поток вывода. Т.к. насколько я успел заметить , поток вывода удерживается главным потоком программы, не давая дочерним пользоваться им.
У вас вообще кто за систему? Что cmd что bash, что mc что far дают же пользоваться своей консолью... Куда ж тогда дочерние процессы вывод направляют?
Да вот в том-то и вопрос, что не понятно куда их вывод направляется...
Цитата: patison
насколько я успел заметить , поток вывода удерживается главным потоком программы, не давая дочерним пользоваться им.
Код в студию!
Что-то я не припомню чтобы стандартные потоки "удерживались" чем-то или кем-то.
Код:
Дочерний:
Код:
void* threadCallback(void* param) {
int clientSockHandle = (int) param;
int recv_result;
sock_package clientPack, servPack;
string sResponse, sTemp;
ofstream outLog( "log.txt" , ios::out);
do {
..................... Диалог с клиентом ...................
}while( клиент_не_отсоединился );
return NULL;
}
int clientSockHandle = (int) param;
int recv_result;
sock_package clientPack, servPack;
string sResponse, sTemp;
ofstream outLog( "log.txt" , ios::out);
do {
..................... Диалог с клиентом ...................
}while( клиент_не_отсоединился );
return NULL;
}
Вот если я внутри do/while буду пытаться что-то вывести при помощи cout - ничего не выйдет. Единственное что может появиться на экране, это: "Client connected: x.x.x.x"