decvar
написал 15 декабря 2005 года в 14:33 (1124 просмотра)
Ведет себя
как мужчина; открыл 111 тему в форуме, оставил 1838 комментариев на сайте.
#ifndef _WIN32
void * DoThread(void * ptr)
{
CProvider * provider = (CProvider*)ptr;
std::cout << ">now casting provider ptr to class instanse...";
if(provider != NULL)
{
std::cout << "[done]" << std::endl;
provider->threadImpl();
}
else
std::cout << "[error]" << std::endl;
}
//Linux version thread
void CProvider::StartThread()
{
int r = pthread_create(&m_thread, &m_attrs, DoThread,
reinterpret_cast(this));
if(r!=0)
std::cout <<
">can't start new pthread, code " <<
r <<
std::endl;
}
#endif
метод CProvider::threadImpl() тоже просто метод этого класса…
При попытке вызова StartThread(); вылетает segfault на моменте provider->threadImpl() внутри DoThread()
Что-то я не пойму чего ему для счастя надо?
Последние комментарии
-
OlegL, 17 декабря 2023 года в 15:00 →
Перекличка
21
-
REDkiy, 8 июня 2023 года в 9:09 →
Как «замокать» файл для юниттеста в Python?
2
-
fhunter, 29 ноября 2022 года в 2:09 →
Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt?
6
-
Иванн, 9 апреля 2022 года в 8:31 →
Ассоциация РАСПО провела первое учредительное собрание
1
-
Kiri11.ADV1, 7 марта 2021 года в 12:01 →
Логи catalina.out в TomCat 9 в формате JSON
1
DevOps as a Service from Palark
24/7 SRE & DevOps service to cover all your Kubernetes needs.

А если вместо threadImpl поставить ф-ю CProvider::TestFunc(int a) { std::cout << a << std::endl; } то как себя будет вести программа? Это позволит определить, проблема ли в threadImpl или же где-то в другом месте.
проблема не с threadImpl(), так как там сразу же стоит std::cout
////////////////////////////////////////////////////////////////////////// // This is listner thread implementation // should not be called directly ////////////////////////////////////////////////////////////////////////// unsigned int CProvider::threadImpl() { // here we are going to listen on the network std::cout << ">starting listner thread"; int sockfd, newsockfd; socklen_t clilen; char buffer[MAX_SIZE]; struct sockaddr_in serv_addr, cli_addr; ... ... ...а выпадает оно так:
decvar@dhcp0-253:~/codding/client> ./client
>there is more than one interface.
>self ip : 192.168.0.253
>now casting provider ptr to class instanse…[done]
Segmentation fault
decvar@dhcp0-253:~/codding/client>
Хм, интересная трабла :) Вечером прийду — разберусь. Если найдешь причину — отпишись тут, ок?
Попробуй дебаггером. Valgrind должен сказать немного больше, чем «segfault».
Good Luck,
UT
а этот *this внутре StartThread… ты под него память откуда берёшь — из стека или из кучи?
И вообще, давай колись на завершённую программу. я по своему разумению дописал, у меня это работает. причём как из стека, так и из кучи. valgrind чтой-то ругается, но я думаю что это проблемы glibc.
вот это работает:
#include #include #include class CProvider { public: CProvider () { pthread_attr_init (&m_attrs); } void StartThread (); void threadImpl (); protected: pthread_attr_t m_attrs; pthread_t m_thread; }; extern "C" void * DoThread(void * ptr) { CProvider * provider = (CProvider*)ptr; std::cout << ">now casting provider ptr to class instanse..."; if(provider != NULL) { std::cout << "[done]" << std::endl; provider->threadImpl(); } else std::cout << "[error]" << std::endl; return NULL; } void CProvider::threadImpl () { std::cout << "IEeee-Ha-aa\n"; return; } //Linux version thread void CProvider::StartThread() { int r = pthread_create(&m_thread, &m_attrs, DoThread, reinterpret_cast(this)); if(r!=0) std::cout << ">can't start new pthread, code " << r << std::endl; } int main () { CProvider *prov = new CProvider; prov->StartThread (); usleep (100); printf ("done\n"); return 0; }все ~450 исходников? Да тут и NDA не даст :)
На самом деле я просто старый пожиратель кореньев, так как ключевая строка :
Всем спасибо за участиет….