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)循环中.
当我第二次运行程序时,我会看到一个错误,如上所示.我无法追查它的起源.任何人都可以解释为什么会导致这个错误?
仅供参考:我不使用任何互斥锁或信号量.我等待线程加入,之后我重新运行整个程序.这与竞争条件有关吗?我假设,当我等待所有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 …Run Code Online (Sandbox Code Playgroud) 我已经在头文件中使用了一段时间的保护,我理解为什么使用它们的唯一原因是在编译时启用单个包含此内容(包含保护的头文件).
我想知道是否有任何其他原因使用标题保护,为什么它们没有在.c文件中使用,如果保护用于.c文件会发生什么?
答.从以下回复中收集.
通常,所有定义都进入.c文件,头文件(.h文件)包含所有声明.包含.c文件不是一个好习惯.
为了在编译特定于翻译单元的过程中只与一个包含的.c文件可用的声明相关联(因此,如果有两个或更多的库需要链接;即,我们有两个或更多翻译单位); 标题保护有助于包含头文件ONLY ONCE.
这是因为预编译器阶段甚至在编译文件以获取对象(.o扩展名)文件之前.预处理器阶段替换整个宏并包含相关数据,这些数据只允许包含.h文件一次.
在systemd环境中,当我执行ps -auxf时,我看到kthread的PID为2,而systemd分配了PID 1.
那么,谁将PID 2分配给kthread,为什么当kthread被称为systemd时它会获得PID 2 ?