0

データベース情報を取得し、オブジェクトのリンクリストとしてデータを保存するためのマルチスレッドアプリケーションがあります。これらのオブジェクトに対していくつかの操作を実行し、結果を出力するためにさらに使用します。実行中に、ポインタの性質上、アクセス違反などの例外が発生する可能性があります。

私は確かにこれらの例外(ハードウェアまたはソフトウェア)がC++の通常のtrycatchによってキャッチされないことを知っています。また、犯人セクションを再プログラミングすることによってそのような例外を回避したことも知っています。例外とプログラム全体がクラッシュします。

アクセス違反をユーザーに通知し、影響を受けるスレッドが他のスレッドまたはプロセス全体をクラッシュさせないようにする方法があるかどうかを知りたいです。

int ex;
pthread_mutex_t lk;

void sighandler(int a){
    pthread_mutex_unlock(&lk);
}

static void *func1(void * arg) {
            while(1) {
        pthread_mutex_lock(&lk);
        if(ex<=0) {
            try {
                    char *p=0;*p = 0;  
                } catch(...) {
                    printf("eerr");
            }
            pthread_mutex_unlock(&lk);
            break;
        }
        ex--;
        pthread_mutex_unlock(&lk);
    }
    return 0;
}

static void *func2(void * arg) {
    while(1) {
            pthread_mutex_lock(&lk);
            if(ex<=-100) {
                    pthread_mutex_unlock(&lk);
                    break;
            }
            ex-=2;
            pthread_mutex_unlock(&lk);
    }
    return 0;
}



int main(void)
{
        signal(SIGSEGV,sighandler);
        ex=100;
    pthread_t pth[2];
    pthread_mutex_init(&lk,NULL);
    pthread_create(&pth[0],NULL,func1,NULL);
    pthread_create(&pth[1],NULL,func2,NULL);

    pthread_join(pth[0],NULL);
        pthread_join(pth[1],NULL);
    return 0;
} 

知りたいことのより単純なバージョンを作成しようとしました。func1(* p = 0)には間違いなくアクセス違反がありますが、何らかのログを通じてユーザーにアクセス違反を通知しながら、func2を妨げられずに実行したいと思います。またはコントローラスレッドを介して。

ありがとうございました

4

0 に答える 0