我正在尝试使用Tilera平台上的pthreads开发一个并行程序。该程序编译没有问题,但当我运行它时,我收到错误:
pthread_create.c:389: start_thread: Assertion `freesize < pd->stackblock_size' failed.
这是什么意思以及如何解决它?
程序的逐步执行表明,当线程试图调用'pthread_exit(NULL);'
时会出现此错误。有什么建议吗?
线程的源代码如下:
void *Consumer(void *threadargs){
// Initialize structure
rtP_Consumer_Controll rtp_lfe;
Init_Consumer(&rtp_lfe);
// Receiving the set of CPUs and thread id
thread_data *th_data = (thread_data *) threadargs;
int th_id = th_data->thread_id;
// Binding this thread to a CPU
if (tmc_cpus_set_my_cpu(th_id) < 0)
tmc_task_die("THREAD Consumer: 'tmc_cpus_set_my_cpu' has failed");
// Activating network communication
if (tmc_udn_activate() < 0)
tmc_task_die("THREAD Consumer: Failure in ’tmc_udn_activate()’.");
// Declaring necessary vars
FOP_data r_data;
real_T result;
// Loop over receiving, processing and sending
while (!terminate)
{
if (tmc_udn0_available_count() == 0) continue;
// Receiving data to process
tmc_udn0_receive_buffer((FOP_data*)&r_data,sizeof(r_data));
// Computing a function
Consumer_Func(r_data.pA,r_data.pB,&rtp_lfe,&result);
printf("THREAD Consumer: result %lf ... \n",result);
}
printf("THREAD Consumer: Finalizing the thread ... \n");
// Exiting the thread
pthread_exit(NULL);
}
Terminate是由主线程修改的全局变量。
执行ulimit -a提供了以下输出:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 8022
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 8022
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
答案 0 :(得分:0)
好吧,我没有找到确切的答案,但是在调试器上玩一点点并联系技术支持就可以解决这个问题。似乎UDN通信是使用堆栈组织的。此外,该堆栈对于UDN的所有demux队列都是相同的。因此,似乎问题来自这样一个事实,即当使用pthread_exit堆栈仍然存在但它已解开时。通过向这样的堆栈添加一个数据包会使其崩溃。
此问题的解决方案是使用TMC_QUEUE而不是UDN。 TMC_QUEUE为共享内存中的特定数据包类型创建FIFO类型。然后,一切都运作良好。