我创建了一个与pthreadVC.lib版本的Win32一起使用的小程序。我正在使用Visual Studio 2013。

当我为同一程序更改了x64的程序设置后,我已经链接了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配置上出现的错误是



编辑:
我也从pthreads in C – a minimal working example复制了示例
并尝试运行,但pthread_join中存在相同错误。

那么,您能告诉我x64是否还有其他设置需要执行,或者我想念的地方在哪里?

最佳答案

在使用互斥锁之前,必须对其进行初始化。您将它们初始化为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(*)()。即使使用了强制类型转换,这也是不正确的,并且会导致未定义的行为。

关于c - 在示例的x64窗口上,崩溃在pthread_cancel和pthread_join上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35811835/

10-13 05:00