我创建了一个与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/