Вопрос № 97972: Язык: Ц++
ОС: ФрииБСД 5
Проблема: Загадочные утечки при работе с потоками pthread_t.
Есть некоторая функция, которая в бесконечном цикле создаёт и запускает потоки, запихивая их в контейнер, например, вектор, и время от времени, напр...Вопрос № 97980: Здравствуйте эксперты. Подскажите пожалста ответ на вопрос:
у меня есть форма приложения и фоном этой формы я хочу задать не просто заливку, а изображение. Я использую компоненту Timage, но картинка закрывает собой подписи полей, ни в свойствах к...Вопрос № 97984: Здравствуйте, уважаемые Эксперты!
Проблема такая: Есть цикл While и он бесконечен, но надо чтобы 1 такт это цикла выполнялся один раз где-то в 5 секунд(не меньше 5 и не больше 10 секунд). Т.е. Цикл выполнился 1 раз подождал секунд 5 и опять выпо...Вопрос № 98017: Здравствуйте.
Помогите, пожалуйста, написать программу на C++. Программа должна производить ряд вычислений и выводить на экран время своего выполнения. Спасибо....Вопрос № 98025: Здравствуйте уважаемые!
Занялся изучением С. Дошел до структур и файлов и натыкаюсь на камни. Вопрос в слудующем:
Программа должна считать структуру из файла. Пользуюсь для этого функцией fread(&struct, sizeof(struct), 1, *filepointer) (Из кн...
Вопрос № 97.972
Язык: Ц++
ОС: ФрииБСД 5
Проблема: Загадочные утечки при работе с потоками pthread_t.
Есть некоторая функция, которая в бесконечном цикле создаёт и запускает потоки, запихивая их в контейнер, например, вектор, и время от времени, например, каждые 1000 циклов, обходит этот контейнер, удаляя завершившиеся потоки (здесь под потоками имеются в виду оболочки, оперирующие pthread). Происходит утечка. Причём если модифицировать код так, что поток джойнится сразу после запуска (естественно, при этом он полностью вырабатывает свой функционал), не добавляясь в контейнер, то утечки не происходит.
В результате исследований было обнаружено, что утечка точно не в контейнере (тестировались самые разные, в том числе и собственные) и точно не в оболочке потока. Вывод о том, что утечка не в моей оболочке потока, был сделан по результатам теста, который создаёт и джойнит простые pthread_t.
Привожу код теста. (Код тестирования контейнера точно такой же, только туда добавляются указатели на созданные структурки, которые потом точно так же удаляются из памяти и контейнера (Утечки при этом не происходит.))
Приложение:
Отправлен: 10.08.2007, 17:40
Вопрос задал: Tundravarg (статус: 1-ый класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: estiGi
Здравствуйте, Tundravarg!
Во-первых, не понятно, какого рода утечки происходят. Где утечки, утечки чего...?
Во-вторых, у вас слишком перекрученный цикл, оперирование переменными и контейнером.
И, хотя по коду вроде как все правильно, вас может обмануть сам компилятор, попробовав соптимизировать некоторых места, и вы даже не будtnt подозревать, но программа начинает вести себя некорректно.
Я бы вот что посоветовал. Замените потоки на небольшой класс, а create/join на new/delete. Поставьте в классе счетчик и проследите, что создается, и что удаляется. Класс такого плана:
class Test
{
public:
Test (int i) {
m_num = i;
print ("Created");
}
~Test ()
{
print ("Removed");
}
В класс передаете индекс в массиве, под которым вы его вводите. Мне кажется, дело в самом цикле, он где то сбоит.
А насчет потоков можно только одно предположить - то, что система не позворляет вам оперировать таким количество потоков, либо потоки просто не успевают отработать, ибо цикл съедает все процессорное время программы. Опять таки, какого рода утечки, вы не написали. Чего у вас утекает-то? :)
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 11.08.2007, 02:50
Отвечает: Ross
Здравствуйте, Tundravarg!
Единственная причина, по которой память может не освобождаться - если в коде
t = pthread_join(ths[i], NULL);
if (t != 0) {
fprintf(stderr, "Error: pthread_join: %d
", t);
continue;
}
функция pthread_join начнет всегда возвращать ненулевое значение для определенных потоков.
В тестовом примере (в приложении) память выделяется и освобождается нормально.
Приложение:
--------- Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 13.08.2007, 15:58
Вопрос № 97.980
Здравствуйте эксперты. Подскажите пожалста ответ на вопрос:
у меня есть форма приложения и фоном этой формы я хочу задать не просто заливку, а изображение. Я использую компоненту Timage, но картинка закрывает собой подписи полей, ни в свойствах компоненты Timage, ни в свойствах формы не могу ничего найти, чтобы исправить это!!!
Отправлен: 10.08.2007, 19:50
Вопрос задал: Rik (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: estiGi
Здравствуйте, Rik!
Возвращайте кисть на свой рисунок из обработчика WM_CTLCOLORDLG, тогда рисунок будет фоновым для остальных контролов
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 10.08.2007, 20:57
Вопрос № 97.984
Здравствуйте, уважаемые Эксперты!
Проблема такая: Есть цикл While и он бесконечен, но надо чтобы 1 такт это цикла выполнялся один раз где-то в 5 секунд(не меньше 5 и не больше 10 секунд). Т.е. Цикл выполнился 1 раз подождал секунд 5 и опять выполнился и т.д. Короче нужна задержка в 5 секунд.
С уважением, Нурлан.
Ответ отправил: Sema (статус: 3-ий класс)
Ответ отправлен: 13.08.2007, 16:18
Вопрос № 98.017
Здравствуйте.
Помогите, пожалуйста, написать программу на C++. Программа должна производить ряд вычислений и выводить на экран время своего выполнения. Спасибо.
Приложение:
Отправлен: 11.08.2007, 07:07
Вопрос задал: Manofmoods (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Sov
Здравствуйте, Manofmoods!
#include <stdio.h>
#include <time.h>
int main()
{
clock_t start, end;
start = clock();
// t = текущее время
int j, i, p;
j=2;
p=3;
for(i = 1; i <= 500000; i++) {
int q = j*p;
q = q/p;
}
// вывод «разница текущего времени с t»
end = clock();
printf("разница текущего времени с t: %f
",(end - start) / CLK_TCK);
return 0;
}
Ответ отправил: Sov (статус: 6-ой класс)
Ответ отправлен: 11.08.2007, 07:36
Вопрос № 98.025
Здравствуйте уважаемые!
Занялся изучением С. Дошел до структур и файлов и натыкаюсь на камни. Вопрос в слудующем:
Программа должна считать структуру из файла. Пользуюсь для этого функцией fread(&struct, sizeof(struct), 1, *filepointer) (Из книги А.Нейбауэра).
Содержимое фала TEST таково:
name......24174. Объявление структуры и код программы в приложении. В тексте программы есть закомментированные строки, используя которые содержимое файла обрабатывается корректно, то есть так:
name......
24
174
Цель же моя - использовать именно функцию fread, которая почему-то выводит:
name......24174
24174
74
Подскажите мою ошибку, второй день сижу :(
Приложение:
Отправлен: 11.08.2007, 10:03
Вопрос задал: Nikankin (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Хватов Сергей
Здравствуйте, Nikankin!
У вас всё просто - строки не завершаются нулевыим байтами.
Поэтому первый puts выводит все три поля.
Да и последний puts выводит правильно только потому что после per в памяти случайно оказался нулевой байт.
Вообще вы тут избежали ещё сюрпризов - поля структур могут выравниваться по границам слов, и между ними могут быть промежутки. В вашем случае все поля char[] и такого нет, но полный размер структуры должен быть 16 байт.
Ответ отправил: Хватов Сергей (статус: Студент)
Ответ отправлен: 11.08.2007, 10:59 Оценка за ответ: 5
Отвечает: kool
Здравствуйте, Nikankin!
Скорее всего это из за выравнивагия полей структуры
Лучше всего использовать прагму
#pragma pack(1). См. приложение.
Удачи!
Приложение:
--------- I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 11.08.2007, 14:24 Оценка за ответ: 5