C : Multithreading using ucontext/Floating point exception(core dumped)

标签 c multithreading

我正在尝试使用 ucontext 例程来实现多线程库。 运行此代码时,我收到“浮点异常(核心转储)”。

#include <stdio.h>
#include <stdlib.h>
#include <ucontext.h>

typedef struct {
    ucontext_t context;
}MyThread;

#define MAX 10
MyThread queue[MAX];
int rear=0,front=0;

void addToQueue(MyThread t)
{
    if(rear==MAX)
    {
        printf("Queue is full!");
        return;
    }

    queue[front]=t;
    front+=1;
}

MyThread* removeFromQueue()
{

    if(front==rear)
    return NULL;

    rear=rear+1;
    return &(queue[rear-1]);

}

static void func12(void)
{
    printf("func12: started\n");
}

static MyThread umain;


MyThread MyThreadCreate (void(*start_funct)(void *), void *args)
{

    MyThread newthread;
    getcontext(&(newthread.context));
    char stck[30];
    newthread.context.uc_stack.ss_sp =stck;
    newthread.context.uc_stack.ss_size = sizeof(stck);
    newthread.context.uc_link =&(umain.context);
    printf("Inside the mythreadcreate before makecontext \n");
    makecontext(&newthread.context,**(void(*)(void))start_funct,1, args);**
    printf("Inside the mythreadcreate after  makecontext \n");
    addToQueue(newthread);

    return newthread;

}

void MyThreadYield(void)
{

    MyThread* a=removeFromQueue();
    printf("Before swapping the context \n");
    swapcontext(&umain.context,&(a->context));

    printf("After the swapping the context \n");
}


int main(void)
{

    int i=0;

    printf("Inside the main \n");

    MyThreadCreate(func12,&i);

    //getcontext(&(umain.context));

    MyThreadYield();



}

返回的输出:

Inside the main  
Inside the mythreadcreate before makecontext  
Inside the mythreadcreate after  makecontext  
Before swapping the context  
func12: started  
Floating point exception (core dumped)

更新:在函数调用中添加了 (void(*)(void))start_funct,1, args)。删除了不必要的函数调用。

最佳答案

分配给 newthread 上下文的堆栈是第一个问题:

char stck[30];
newthread.context.uc_stack.ss_sp =stck;

“stck”分配在MyThreadCreate函数的堆栈上。一旦函数返回,它就会超出范围,因此 newthread.context.uc_stack.ss_sp 指向原始线程堆栈中某处的某些内存。

具体来说,newthread 和新的原始线程此时“共享”相同的堆栈,这会导致核心转储(它们可能会覆盖自身)。 使用 mallocnewthread.context.uc_stack.ss_sp 分配适当的内存。

现在,many platforms won't allow code to be contained in the heap 。堆栈本质上包含要执行的代码指令。 这将导致上下文执行时程序失败。

上面的链接给出了有关如何允许内存段包含要执行的代码的指示。 或者,一个简单的解决方案是使用堆栈上的一些内存,这些内存在不再使用上下文之前不会被丢弃(例如,在 main 中声明的数组)。

关于C : Multithreading using ucontext/Floating point exception(core dumped),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25495507/

相关文章:

java - 为什么同步在此代码中无法正常工作?

c - 如何将 double 数据转换为 uint8 数组并再次返回 double

C - 出现段错误(核心已转储)

c - 如何在 c 中使用 execl() 函数在文件中打印 stderr 消息

c - 为什么多次运行同一个程序时执行时间会有所不同?

带有 Docker 的 Python Luigi - 线程/信号问题

arrays - 以 30% 的概率动态分配和初始化新对象

iphone - NSOperation 和 CoreData 线程

java - java中从一个套接字线程向所有现有套接字线程广播数据

java - 完成 future : Why we need stages at all?