Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

cout как критическая секция, и доступ родительского/дочернего потоков

444
08 октября 2009 года
patison
323 / / 15.03.2007
Вот вопросик какой всплыл.
Имеется программа, в которой основной поток создаёт N дочерних потоков.
Вопрос - как реализовать совместный доступ к выводу текста в консоль для всех потооков (поочерёдный доступ). Само использование семафоров/мьютексов - это понятно. Вопрос в том, как заставить основной поток "открыть" доступ в поток вывода. Т.к. насколько я успел заметить , поток вывода удерживается главным потоком программы, не давая дочерним пользоваться им.
14
08 октября 2009 года
Phodopus
3.3K / / 19.06.2008
У вас вообще кто за систему? Что cmd что bash, что mc что far дают же пользоваться своей консолью... Куда ж тогда дочерние процессы вывод направляют?
444
13 октября 2009 года
patison
323 / / 15.03.2007
Да вот в том-то и вопрос, что не понятно куда их вывод направляется...
5
13 октября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: patison
насколько я успел заметить , поток вывода удерживается главным потоком программы, не давая дочерним пользоваться им.


Код в студию!
Что-то я не припомню чтобы стандартные потоки "удерживались" чем-то или кем-то.

444
13 октября 2009 года
patison
323 / / 15.03.2007
Основной поток (ф-ия main()):
Код:
.................
    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 );
        }
    }
.................


Дочерний:
Код:
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;
}


Вот если я внутри do/while буду пытаться что-то вывести при помощи cout - ничего не выйдет. Единственное что может появиться на экране, это: "Client connected: x.x.x.x"
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог