在 C 中使用 pthread 的 MathGL 库崩溃

MathGL library using pthread in C crashes

提问人:mohammadsdtmnd 提问时间:11/17/2022 最后编辑:mohammadsdtmnd 更新时间:11/19/2022 访问量:38

问:

我直接尝试将 mathGL 的 C++ 示例转换为 C 代码:

#include <mgl2/mgl_cf.h>
#include <mgl2/wnd_cf.h>
#include <mgl2/fltk.h>

#include <pthread.h>
#include <synchapi.h>

//mglFLTK *gr=NULL; // pointer to window
HMGL gr = NULL;//HMGL mgl_create_graph_fltk
void *calc(void *) // function with calculations
{
//  mglPoint pnt; // some data for plot
//  HMDT dat;
//  dat= mgl_create_data () ;
    for(long i=0;;i++) // do calculation
    {
//      long_calculations(); // which can be very long
//      Sleep(200);
        for(uint64_t i=0;i<200000;i++);
//      pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1);
        if(gr)
        {
//          gr->Clf(); // make new drawing
            mgl_clf ( gr) ;
            // draw something
//          gr->Line(mglPoint(),pnt,"Ar2");
            mgl_line(gr,0,0,0,2*mgl_rnd()-1,2*mgl_rnd()-1,0,"Ar2",2);

            char str[16]; snprintf(str,15,"i=%ld",i);

//          gr->Puts(mglPoint(),str);
            mgl_puts(gr,0,0,0,str,":C",-.7);
            // don’t forgot to update window
//          gr->Update();
             mgl_wnd_update(gr);

        }
    }
}

但它不起作用。我之前在控制台中添加了打印,它只打印一次:.我正在使用 Windows 10 并通过 eclipse IDE 通过 MSYS2 安装了 minGW GCC 和 mathgl。虽然我在这里创建了未线程的:printfmgl_wnd_updateii=0

int main(int argc,char **argv)
{
gr = mgl_create_graph_fltk(NULL, "First C graph", NULL, NULL);

mgl_fltk_thr ();

while(1)
{
    Sleep(100);
    mgl_clf ( gr) ;
    // draw something
//          gr->Line(mglPoint(),pnt,"Ar2");
    mgl_line(gr,0,0,0,2*mgl_rnd()-1,2*mgl_rnd()-1,0,"Ar2",-.5);

    char str1[16]; snprintf(str1,15,"i=%ld",1);

//          gr->Puts(mglPoint(),str);
    mgl_puts(gr,0,0,0,str1,":C",-.5);
    // don’t forgot to update window
//          gr->Update();
     mgl_wnd_update(gr);
}
return 0;
}

这是作品。那个线程代码有什么问题?似乎线程循环只工作一次。但是这个循环在无线程程序上运行良好!

C 多线程 pthreads posix mathgl

评论

1赞 Andrew Henle 11/17/2022
您是否有任何文档说明所有函数都是多线程安全的?mgl_*()
0赞 mohammadsdtmnd 11/17/2022
@AndrewHenle 让我们假设它们不安全。但只有我们有一个线程。并且该线程会不断更新图形。没有什么可冲突的,不是吗?
0赞 mohammadsdtmnd 11/17/2022
@AndrewHenle 但我从文档中得到的解释是,所使用的函数必须与线程兼容。
0赞 John Bollinger 11/22/2022
我能想到至少两件事可能是使用 pthread 的代码有问题,但没有足够的信息来评估这些可能性。我们需要一个最小的可重复的例子
0赞 mohammadsdtmnd 11/23/2022
@JohnBollinger,线程代码是可重现的。我使用 eclipse、minGW64、MSYS2、windows 10 64bit 完成了这项工作。此外,除了包含标头之外,我们还需要包含它的库。

答: 暂无答案