Привет!
Есть довольно большой проект на C++, в котором ни с того, ни с сего
перестали работать семафоры (используем обертку ACE_Thread_Semaphore).
Долго сидел и искал ошибку. В итоге написал маленький пример на
полстраницы, который демонстрирует проблему:
////////////////////////////////////////////////////////////////////
#include <iostream>
#include <cassert>
#include <ace/Thread_Semaphore.h>
extern "C"
{
#include <time.h>
}
int main(int argc, char** argv)
{
if(argc > 1)
{
const time_t current_unix_time = ::time(NULL);
assert(current_unix_time != -1);
struct tm tm_, *ptm;
ptm = ::localtime_r(¤t_unix_time, &tm_);
assert(ptm);
assert(ptm == &tm_);
std::cout << "UNIX time = " << current_unix_time << ", Local time = "
<< 1900 + ptm->tm_year << "-" << 1 + ptm->tm_mon << "-" << ptm->tm_mday
<< " " << ptm->tm_hour << ":" << ptm->tm_min << ":" << ptm->tm_sec << std::endl;
}
ACE_Thread_Semaphore sem(0);
std::cout << "Before acquiring the semaphore. We must hang here since current value of semaphore is 0." << std::endl;
int r = sem.acquire();
std::cout << "After acquiring the semaphore. r = " << r << ". " << strerror(errno) << std::endl;
return 0;
}
////////////////////////////////////////////////////////////////////
Собираю следующей командой:
g++-4.3.2 -g -I /usr/local/dev/ace-5.6.7/include/ -L /usr/local/dev/ace-5.6.7/lib/ -pthread -lACE main.cpp
Итак, в чем же проблема (точнее как она проявляется).
1) Сначала запустим программу без параметров:
krivenok@develop2 13:29:32 /tmp/strange $ ./a.out
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@develop2 13:30:24 /tmp/strange $
Как и ожидалось мы блокируемся на семафоре.
2) Теперь запустим программу с параметрами (argc > 1):
krivenok@develop2 13:30:24 /tmp/strange $ ./a.out 1
UNIX time = 1238405487, Local time = 2009-3-30 13:31:27
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
After acquiring the semaphore. r = -1. Function not implemented
krivenok@develop2 13:31:27 /tmp/strange $
Если в первом случае в выводе strace видим:
write(1, "Before acquiring the semaphore. W"..., 89Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
) = 89
futex(0x804f750, FUTEX_WAIT, 0, NULL^C <unfinished ...>
То во втором:
write(1, "Before acquiring the semaphore. W"..., 89Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
) = 89
futex(0x804f7e8, 0xb7cbb170 /* FUTEX_??? */, 0) = -1 ENOSYS (Function not implemented)
write(1, "After acquiring the semaphore. r "..., 64After acquiring the semaphore. r = -1. Function not implemented
) = 64
То есть в вызов futex передается мусор.
Есть идеи в чем проблема?
Может я где-то сильно туплю и не вижу очевидного?
Мои эксперименты показывают, что причина проблемы - вызов
функции localtime_r (пробовал и localtime, и gmtime[_r]).
Если ее убрать, что все работает как ожидалось.
Кстати, обнаружилась проблема после обновления glibc
с версии 2.6.1 до 2.8.
Параметры системы:
1) gcc
krivenok@develop2 13:37:34 /tmp/strange $ g++-4.3.2 --version
g++-4.3.2 (GCC) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
krivenok@develop2 13:37:39 /tmp/strange $
2) glibc
krivenok@develop2 13:37:39 /tmp/strange $ ls -al /lib/libc.so.6
lrwxrwxrwx 1 root root 11 Мар 28 15:31 /lib/libc.so.6 -> libc-2.8.so
krivenok@develop2 13:38:30 /tmp/strange $
3) ACE
5.6.7
Всем заранее спасибо за помощь!
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от true_admin
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от Krivenok_Dmitry
Ответ на:
комментарий
от Krivenok_Dmitry
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум mysql++ вопрос по с++ (2009)
- Форум timertt — библиотека с реализацией таймерных нитей для C++11 (2014)
- Форум Заставить SDL2 работать с шейдерами OpenGL (2017)
- Форум Семафоры (2005)
- Форум Семафоры (2003)
- Форум семафоры (2005)
- Форум семафоры (2006)
- Форум семафоры (2005)
- Форум Nginx + PHP - No input file specified. (2020)
- Форум Переодически вылетает ошибка 502 - nginx (2016)