2

バージョンpthreadVC.libで動作する小さなプログラムを作成しました。Win32Visual 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構成で取得するエラーは

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() を使用して削除する必要があります。

もう 1 つの問題は、pthread_create() に渡される関数です。そのタイプは でなければなりませんvoid*(*)(void*)。関数のタイプは ですvoid(*)()。キャストを使用したとしても、これは正しくなく、未定義の動作を引き起こします。

于 2016-03-05T09:47:13.880 に答える