在 C 中实现队列结构和线程时,在未预先打印语句时出现段错误
Getting Seg Fault when not Printing Statement Beforehand when implementing Queue Structure and Threads in C
我正在经历最运行最大的事情。在我的代码中,我将双向链表实现为队列。我使用这个线程队列在函数之间切换。例如,它的工作方式是我有一些任意数字 A 和 B。A 是线程数,B 是每个线程执行的次数。例如,使用 A = 2 和 B = 3。我首先调用一个名为 start_thread 的方法来启动每个函数的线程。由于 A = 2,我会调用它两次:start_thread(funct1); start_thread(函数2);。在这个方法中,TCB_T 个对象被添加到我的队列对象中。然后我调用 运行() 方法,如下所示。然后程序应该在 funct1 和 funct2 之间交替,直到每个都有 运行 B (3) 次。在每个函数中,我调用 yield 方法,它实际上只是切换到下一个线程。
抱歉解释得太长,我已经在下面列出了我提到的所有方法,以便您自己查看。
所以 st运行ge 错误是在我的 main 函数中我有一个用于调试的打印语句。它所做的只是打印“here\n”。当我 运行 程序时,结果是完美的,正是我需要的。但是,当删除此打印语句或更具体地说当删除 \n 时,我会遇到段错误。
我 运行 GDB 试图查看问题,但它告诉我段错误发生在我的队列文件中,更具体地说是在我尝试访问 Head->Head- 时的 Delete 方法中>下一步。我在 add 方法和 newItem 方法中都采取了额外的预防措施,以确保它已分配内存并且它被设置为 Null 或 TCB_T 对象。
对于如此彻底和冗长的问题,我深表歉意post 这似乎是一个小问题,我觉得解决方案可能有很多层次,所以我认为最好提供所有必要的文件和试着定义我用它们做什么。
总而言之,当 main 中包含打印语句时,我的程序运行良好,否则会出现段错误。当 RotateQ 调用该函数时,段错误发生在 DeleteQueue 中。我可以确认 function1 运行s 一次(打印语句说明它是什么迭代),然后程序 运行s 进入这个问题。如果有人找到解决方案或对如何找到解决方案有任何建议,我们将不胜感激。谢谢。
sizeof(stackPtr)
不是用 malloc()
为 stackPtr
分配的内存量。就是一个指针的大小,在64位系统下是8个字节。
因此,当您执行 tcb->context.uc_stack.ss_size = (size_t) stack_size;
时,您将线程堆栈的大小设置为仅 8 个字节。
init_TCB()
的参数应该是您分配的内存区域的大小,8192
。
我正在经历最运行最大的事情。在我的代码中,我将双向链表实现为队列。我使用这个线程队列在函数之间切换。例如,它的工作方式是我有一些任意数字 A 和 B。A 是线程数,B 是每个线程执行的次数。例如,使用 A = 2 和 B = 3。我首先调用一个名为 start_thread 的方法来启动每个函数的线程。由于 A = 2,我会调用它两次:start_thread(funct1); start_thread(函数2);。在这个方法中,TCB_T 个对象被添加到我的队列对象中。然后我调用 运行() 方法,如下所示。然后程序应该在 funct1 和 funct2 之间交替,直到每个都有 运行 B (3) 次。在每个函数中,我调用 yield 方法,它实际上只是切换到下一个线程。
抱歉解释得太长,我已经在下面列出了我提到的所有方法,以便您自己查看。
所以 st运行ge 错误是在我的 main 函数中我有一个用于调试的打印语句。它所做的只是打印“here\n”。当我 运行 程序时,结果是完美的,正是我需要的。但是,当删除此打印语句或更具体地说当删除 \n 时,我会遇到段错误。
我 运行 GDB 试图查看问题,但它告诉我段错误发生在我的队列文件中,更具体地说是在我尝试访问 Head->Head- 时的 Delete 方法中>下一步。我在 add 方法和 newItem 方法中都采取了额外的预防措施,以确保它已分配内存并且它被设置为 Null 或 TCB_T 对象。
对于如此彻底和冗长的问题,我深表歉意post 这似乎是一个小问题,我觉得解决方案可能有很多层次,所以我认为最好提供所有必要的文件和试着定义我用它们做什么。
总而言之,当 main 中包含打印语句时,我的程序运行良好,否则会出现段错误。当 RotateQ 调用该函数时,段错误发生在 DeleteQueue 中。我可以确认 function1 运行s 一次(打印语句说明它是什么迭代),然后程序 运行s 进入这个问题。如果有人找到解决方案或对如何找到解决方案有任何建议,我们将不胜感激。谢谢。
sizeof(stackPtr)
不是用 malloc()
为 stackPtr
分配的内存量。就是一个指针的大小,在64位系统下是8个字节。
因此,当您执行 tcb->context.uc_stack.ss_size = (size_t) stack_size;
时,您将线程堆栈的大小设置为仅 8 个字节。
init_TCB()
的参数应该是您分配的内存区域的大小,8192
。