2

我已经创建了正在使用pthreadVC.lib哪个Win32版本的小程序。我正在使用视觉工作室 2013。

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

我的测试代码

#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;
} 

在 x64 配置上出现的错误是

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

编辑: 我还从C 中的 pthreads 复制了示例——一个最小的工作示例 并尝试运行但在pthread_join.

那么你能告诉我是否有任何其他设置需要做x64或我错过了什么?

4

1 回答 1

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(*)(). 即使您使用了强制转换,这也不正确并且会导致未定义的行为。

于 2016-03-05T09:47:13.880 回答