getvariana:tpp.c:63:__ pthread_tpp_change_priority:断言`new_prio == -1 || (new_prio> = __sched_fifo_min_prio&& new_prio< = __sched_fifo_max_prio)'失败。
大家好,
我正在尝试重新运行一个创建5个线程的程序,在pthread_join()之后,我做了一个返回,基于此,我重新运行整个程序,即它在while(1)循环中。 / p>
当我第二次运行程序时,我会看到一个错误,如上所示。我无法追查它的起源。任何人都可以解释为什么会导致这个错误?
仅供参考:我不使用任何互斥锁或信号量。我等待线程加入,之后我重新运行整个程序。这与竞争条件有关吗?我假设,当我等待所有5个线程加入时,只有这样我才能离开pthread
main
{
while(1)
{
test();
}
}//main
test()
{
for( i = 0; i < 5; i++ )
pthread_create( &th[i], NULL, tfunc, &some_struct);
for( i = 0; i < 5, i++ )
pthread_join( th[i], NULL);
}
void * tfunc( void * ptr )
{
// waiting for a callback function to set a global counter to a value
// sleep until then
if( g_count == value_needed )
pthread_exit(NULL);
}
答案 0 :(得分:6)
这是你的程序清理完毕。它在没有上述断言的情况下运行:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
static pthread_t th[5];
void *
tfunc (void *ptr)
{
sleep (5); /* remove this to test it without the sleep */
pthread_exit (NULL);
}
void
test ()
{
int i;
memset (th, 0, 5 * sizeof (pthread_t));
for (i = 0; i < 5; i++)
{
if (pthread_create (&th[i], NULL, tfunc, NULL) < 0)
perror ("pthread_create");
}
for (i = 0; i < 5; i++)
{
if (pthread_join (th[i], NULL) < 0)
perror ("pthread_join");
}
}
int
main (int argc, char **argv)
{
while (1)
{
test ();
}
exit (0);
}
这是我清理它时注意到的:
for( i = 0; i < 5, i++ )
逗号不用分号表示循环可能无法正常工作
test()
中,th
未归零,这意味着任何失败的pthread_create
都使用旧的线程参考。
在tfunc
中,如果pthread_join
你做了( g_count == value_needed )
,但无论如何你都退出了,即你总是立即做pthread_join
或同等的事情。注意我在没有sleep()
的情况下测试了下面的版本,因此现在立即退出。
各种其他正字法问题。
无错误处理
由于存在一些编译问题,我怀疑您可能没有编译上面粘贴的代码,但更复杂的东西。而且我怀疑这是造成这个问题的一部分。
如果您发布实际导致问题的可编译代码的最小示例,我可能会进一步帮助您。
答案 1 :(得分:4)
tpp.c:63:__ pthread_tpp_change_priority:断言是一个已知问题并已解决:
https://sourceware.org/ml/libc-help/2008-05/msg00071.html简而言之,问题是由重复锁定引起的fast mutex
,并使用recursive mutex
解决,默认pthread_mutex_t
不是递归的。是否有可能pthread_mutex_t
深入到运行代码的线程中?
顺便说一句,为了使互斥锁递归,plz使用属性PTHREAD_MUTEX_RECURSIVE_NP
设置互斥锁属性。
答案 2 :(得分:0)
在我的情况下,我使用了QCoreApplication
和boost::thread
,并且在程序退出时发生了错误。当程序收到退出信号时,我中断了整个boost::thread
,但实际上并没有足够优雅。因此,我通过在slot函数中主动调用app.quit()
来解决了这个问题。也许检查退出方式可能会有帮助。