我创建了一个小程序,它使用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
或我遗失的地方还有其他设置需要做什么?
答案 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(*)()
。即使您使用了强制转换,但这并不正确并导致未定义的行为。