2012-03-11 86 views
0

我正在开发一个项目,我需要让程序在多个线程上运行。但是,我遇到了一些问题。多线程(pthreads)

在我的程序中,我有一个称为'func_call'的附件功能。 如果我用这个在我的代码:

func_call((void*) &my_pixels); 

程序运行正常。

但是,如果我尝试创建一个线程,然后运行该函数,程序将运行到一个分段错误。

pthread_t thread; 
pthread_create (&thread, NULL, (void*)&func_call, (void*) &my_pixels); 

我在我的程序中包含了pthread.h。任何想法可能是错误的?

+0

有点难以从这里给出的小碎片中分辨出来,但是my_pixels参数超出了范围,然后它所占用的内存正在被一些其他值导致随机指针值覆盖 – Nick 2012-03-11 01:06:31

+0

my_pixels是结构体的一个实例与我需要发送该函数的变量。在调用pthread之前,我在main函数中初始化了struct和它的变量。一旦程序进入func_call函数,它将在本地保存变量。 – user1261711 2012-03-11 01:09:11

+0

@user:my_pixels的寿命是多少? 'func_call'如何使用线程参数?主线程和'func_call'之间是否有同步?请显示代码;一个解释不会提供所有相关的细节。 – 2012-03-11 01:18:00

回答

0

你是不是在一个线程安全的方式来处理数据:

  • 从线程的说法,这是一个指向主线程的my_pixels变量的线程副本的数据;主线程可能会退出,使得my_pixles无效。
  • 线程使用scene,主线程调用free_scene()就可以了,这是我想象使它无效
  • 线程调用printf(),主线程关闭stdout(一种不寻常的本身)
  • 线程更新picture阵列,主线程访问picture输出数据从它

它看起来像你应该只是等待线程创建后完成其工作 - 呼叫pthread_join()做到这一点。

对于单线程来说,这似乎毫无意义(你只是将一个多线程程序变成了一个单线程程序)。但是,在注释掉的代码的基础上,它看起来像你打算启动几个在数据块上工作的线程。因此,当您再次尝试时,请确保您加入所有您开始的线程。只要线程不修改相同的数据,它就可以工作。请注意,您需要为每个线程使用单独的my_pixels实例(创建它们的一个阵列,就像您使用pthreads一样),或者某些线程可能会获取用于不同线程的参数。

+0

这样做!谢谢一堆!所以要加入线程,一个简单的for循环就足够了,是吗? – user1261711 2012-03-11 02:37:16

+0

@user:一个简单的循环应该做的伎俩。 – 2012-03-11 02:45:03

0

不知道func_call做什么,很难给你一个答案。尽管如此,这里有几个可能性

  1. func_call是否使用某种全局状态 - 检查是否从线程内正确初始化。线程的执行顺序并不总是每次执行相同
  2. 不知道你的操作系统(AIX/Linux/Solaris上等),它是很难回答这个问题,但请检查您的编译选项
  3. 请提供signal对于所有的线程来说,至少要有几行堆栈跟踪。您可以自行检查的一件事是打印线程的堆栈轨迹(使用基于调试器的threads/threadpthreadthread current <x>)以及是否存在正在访问的公用数据。当两个线程试图读取另一个(未提交的)更改时,很可能发生段错误

希望有所帮助。我想问题是全局的picture数组。你似乎在没有任何警卫的情况下在线程函数中修改它。您使用pxpy循环,并且所有线程将具有相同的pxpy,并将尝试同时写入picture阵列。请尝试修改您的代码,以防止多个线程踩在彼此的数据修改。

+0

感谢您的回复。我很确定func_call被正确初始化。它作为独立功能运行得非常好。我用C编写这个代码,但是在Linux终端上运行它。此外,我目前正在试图让这个代码只在一个线程上工作,然后再转到多线程。所以,我认为segfault必须从别的东西出来。 – user1261711 2012-03-11 01:15:29

+0

核心文件的堆栈跟踪是否有助于缩小问题原因的可能性。就像@尼克提到的那样,你的数据中的一些指针可能会损坏导致段错误 – Gangadhar 2012-03-11 01:19:16

+0

回溯不起作用。我相信这是我指责的一个问题,所以我试图用几个不同的断点进行调试。 – user1261711 2012-03-11 01:47:08

0

func_call函数,还是函数指针?如果它是一个函数指针,那么存在你的问题:你得到了一个函数指针的地址,然后将其转换。

人们猜测,因为你只提供了一小部分程序,其中提到的名字如func_call,没有声明的范围。

由于您将(void *)表达式传递给函数指针参数,因此编译器必须向您提供有关此程序的诊断信息。

以与pthread_create兼容的方式定义线程函数,然后在没有任何强制转换的情况下调用它。

相关问题