在窗口x64构建的示例崩溃在pthread_cancel和pthread_join

时间:2016-03-05 08:20:22

标签: c multithreading pthreads pthreads-win32

我创建了一个小程序,它使用pthreadVC.lib Win32版本。我正在使用visual studio 2013。

当我更改x64相同程序的程序设置,然后我链接了pthreadVC2.lib(用于x64配置),然后我的程序在pthread_join崩溃,而不是我使用{ {1}}但有同样的问题。此外,我自己为x64构建了pthread并链接了该库但仍然存在同样的问题。

我的测试代码

pthread_cancel

x64配置的错误是

  

0x0000000180002C70(pthread_dll.dll)中的未处理异常   Pthread64_bit.exe:0xC0000005:访问冲突读取位置   0x000000000000001A。

修改: 我也复制了pthreads in C – a minimal working example的例子 并尝试在#include<stdio.h> #include<pthread.h> pthread_mutex_t mutex = NULL; pthread_cond_t cond = NULL; void test(){ pthread_mutex_lock(&mutex); printf("\n Threads Working"); pthread_mutex_unlock(&mutex); } void main() { pthread_t threadid; pthread_create(&threadid,NULL,(void*)test,NULL); pthread_join(threadid,NULL); printf("\n FINISH "); if (getchar()) return; } 中运行但有相同的错误。

那么你能否告诉我pthread_join或我遗失的地方还有其他设置需要做什么?

1 个答案:

答案 0 :(得分:2)

互斥锁必须在使用之前进行初始化。您将它们初始化为NULL,然后尝试使用它们。这是错误的。

错误消息是一个明确的指示符,表示在一个小偏移量处取消引用NULL指针,正在访问结构的一个成员:访问冲突读取位置0x000000000000001A

因此,请删除不正确的初始化,并在使用前初始化互斥锁:

const int error = pthread_mutex_init( &mutex );
if( error ) 
{
    //handle error
}

并在不再使用时将其删除:

const int error = pthread_mutex_destroy( &mutex );
if( error ) 
{
    //handle error
}

或者可以使用以下命令初始化互斥锁:PTHREAD_MUTEX_INITIALIZER:

pthread_mutex mutex = PTHREAD_MUTEX_INITIALIZER ;

仍应使用pthread_mutex_destroy()删除它们。

另一个问题是传递给pthread_create()的函数。它的类型必须是void*(*)(void*)。您的函数类型为void(*)()。即使您使用了强制转换,但这并不正确并导致未定义的行为。