- 论坛徽章:
- 1
|
本帖最后由 zhangruichao88 于 2015-01-09 17:50 编辑
有一个线程池的程序,用gdb执行的时候是正确的,但直接执行会出错,如果使用gdb附着进程继续执行,也是正确的,我该怎么解决啊,请各位大神出山
/**********************************************************
* 函数 : myFunc *
* 功能 : 数据处理 *
* 输入 : *
* 输出 : *
* 返回 : *
* 说明 : *
***********************************************************/
void myFunc(void * const arg)
{
printf("myFunc arg = %p\n", arg);
//if(arg == NULL)
// return;
bool RevComplete = false; //数据接收完成的标识
struct timespec time_out;
memset(&time_out, 0, sizeof(time_out));
time_out.tv_sec = time(0);// + 60; //60s
time_out.tv_nsec = IDLE_SCAN_PERIOD * 10 * 1000 * 1000; //100ms
pthread_mutex_lock(&m_Mutex);
//AppMend *AppModule = (AppMend *)malloc(sizeof(AppMend));
//memcpy(AppModule, (AppMend*)arg, sizeof(AppMend));
AppMend *AppModule = (AppMend *)arg;
/*if(arg != NULL)
{
free(arg);
arg = NULL;
}*/
pthread_mutex_unlock(&m_Mutex);
u_int FlowID = AppModule->GetFlowId();
pthread_mutex_lock(&m_pthreadMap);
if(flow2pid.find(FlowID) == flow2pid.end())
{
flow2pid.insert(map<u_int, pthread_t>::value_type(FlowID, pthread_self()));
}
pthread_mutex_unlock(&m_pthreadMap);
//std::cout << "CreateTask FlowID = " << FlowID << ", flow2pid[FlowID] = "
// << flow2pid[FlowID] << ", pid = " << pthread_self() << std::endl;
//等待信号
while(1)
{
printf("arg = %p\n", arg);
int rc = 0;
siginfo_t myinfo;
//组包并排序
if(!RevComplete)
{
AppModule->DataSort(false);
}
else
{
AppModule->DataSort(true);
break;
}
sigset_t oldmask;
/*
if(sigprocmask(SIG_BLOCK, &set, &oldmask) < 0)
{
fprintf(stderr, "SIG_BLOCK error/n"
continue;
}
*/
rc = sigtimedwait(&set, &myinfo, &time_out);
if(rc == -1)
{
printf("sorry thread time out !\n"
//std::cout << "sorry thread[" << pthread_self() << "] time out !" << std::endl;
RevComplete = true; //超时发送数据接收的标识
continue;
}
//if(AppModule == NULL)
// AppModule = (AppMend *)malloc(sizeof(AppMend));
if(AppModule != NULL)
{
memset(AppModule, 0, sizeof(AppMend));
if(!pthread_recv(AppModule))
{
cout << "Share Memory error !\n";
RevComplete = true; //共享内存为空发送数据接收的标识
continue;
}
}
//std::cout << "pthread_recv FlowID = " << AppModule->GetFlowId() << ", flow2pid[FlowID] = "
// << flow2pid[AppModule->GetFlowId()] << ", pid = " << pthread_self() << std::endl;
}
if(AppModule != NULL)
{
free(AppModule);
//AppModule = NULL;
}
pthread_mutex_lock(&m_pthreadMap);
//解除相应map
for(map<u_int, pthread_t>::iterator iter1 = flow2pid.begin(); iter1 != flow2pid.end()
{
if(iter1->first == FlowID)
{
//std::cout << "free FlowID = " << FlowID << ", flow2pid[FlowID] = " << flow2pid[FlowID] << std::endl;
flow2pid.erase(iter1++);
}
else
++iter1;
}
pthread_mutex_unlock(&m_pthreadMap);
}
在打印while循环下的arg时,会提示printf出错,如果删除该行,则会提示User defined signal 1 后程序终止
|
|