gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:22 25 4
gpt4 key购买 nike

我已经创建了与 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 配置上的错误是

Unhandled exception at 0x0000000180002C70 (pthread_dll.dll) in Pthread64_bit.exe: 0xC0000005: Access violation reading location 0x000000000000001A.

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

那么你能告诉我是否需要为 x64 或我遗漏的地方做任何其他设置?

最佳答案

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

该错误消息清楚地表明一个 NULL 指针在一个小的偏移处被取消引用,一个结构的成员正在被访问:访问冲突读取位置 0x000000000000001A

因此去掉不正确的初始化,使用前先初始化mutex:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com