0

これは、より大きなシミュレーションの始まりにすぎません。アイデアは、3 つのスレッドと 2 つのファイルを持ち、通常の条件でデッドロックが発生することであり、私はそれを具体的にハードコーディングしました。

スレッドが実行された後、プロセスがコンソールで Abort (コア ダンプ) で中止されることがあります。以下の出力があります...これはデッドロックですか?? 出力を望ましい形式で取得できなかったことをお詫びしますが、メモリへのバックトレースは簡単にフォーマットできません。

Time Interval 4000250
*** glibc detected *** ./a.out: double free or corruption (out): 0x00007fa2dc000b00 *** 
 ======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7e626)[0x7fa2e351d626]
/lib/x86_64-linux-gnu/libc.so.6(fclose+0x155)[0x7fa2e350d2a5]
./a.out[0x400a05]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a)[0x7fa2e3863e9a]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7fa2e35914bd]
======= Memory map: ========
00400000-00401000 r-xp 00000000 07:00 163351                              /home/kartheek    /Desktop/a.out
00601000-00602000 r--p 00001000 07:00 163351                             /home/kartheek    /Desktop/a.out

00602000-00603000 RW-P 00002000 07:00 163351/home/kartheek/desktop/a.out 00923000-00944000 RW-P 00000000:00 -P 00000000 00:00 0 7FA2DC000000-7FA2DC021000 RW-P 00000000 00:00 0 7FA2DC021000-7FA2E0000000-- P 00000000000000000000 0000 0000 0000 0000 00000 0 7FA2E2287000-7FA2E229C000 R-XP000000000000000000000000 00000 /libgcc_s.so.1 7fa2e229c000-7fa2e249b000 ---p 00015000 07:00 4805 /lib/x86_64-linux-gnu/libgcc_s.so.1 7fa2e249b000-7fa2e249c000 r--p 00014000 07-8x8/lib_8/4:00 /libgcc_s.so.1 -gnu/libgcc_s.so.1 7fa2e249c000-7fa2e249d000 rw-p 00015000 07:00 4805 /lib/x86_64-linux-gnu/libgcc_s.so.1 7fa2e249d000-7fa2e249e000 ---p 00000000 00:00 0 7fa2e249e000-7fa2e2c9e000 rw-p 00000000 00:00 0 7fa2e2c9e000-7fa2e2c9f000 ---p 00000000 00:00 0 7fa2e2c9f000-7fa2e349f000 rw-p 00000000 00:00 0 7fa2e349f000-7fa2e3652000 r-xp 00000000 07:00 4784 /lib/x86_64-linux-gnu/libc-2.15.so 7fa2e3652000-7fa2e3851000 ---p 001b3000 07:00 4784 /lib/x86_64-linux-gnu/libc-2.15.so 7fa200385 7fa2e3855000 r--p 001b2000 07:00 4784 /lib/x86_64-linux-gnu/libc-2.15.so 7fa2e3855000-7fa2e3857000 rw-p 001b6000 07:00 4784 /lib/x86_64-linux-gnu/libc. -7fa2e385c000 rw-p 00000000 00:00 0 7fa2e385c000-7fa2e3874000 r-xp 00000000 07:00 4864 /lib/x86_64-linux-gnu/libpthread-2.15.so 7fa2e3874000-7fa2e03a7300 4864 /lib/x86_64-linux-gnu/libpthread-2.15.so 7fa2e3a73000-7fa2e3a74000 r--p 00017000 07:00 4864 /lib/x86_64-linux-gnu/libpthread-2.15.so 7fa2e3a740000 007fa2e3a75 :00 4864 /lib/x86_64-linux-gnu/libpthread-2.15.so 7fa2e3a75000-7fa2e3a79000 rw-p 00000000 00:00 0 7fa2e3a79000-7fa2e3a9b000 r-xp 00000000 07:00/4-nugld-linux-476/476 2.15.SO 7FA2E3C80000-7FA2E3C83000 RW-P 000000000000000000 000000 0000 0000 0000 00000 0 7FA2E3C97000-7FA2E2E3C9B000 RW-P 00000000:00そう 7fa2e3c9c000-7fa2e3c9e000 rw-p 00023000 07:00 4764 /lib/x86_64-linux-gnu/ld-2.15.so 7fffa77ef000-7fffa7810000 rw-p 00000000 00:00 0 [スタック] 7fffa784f000-7fffa7850000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 中止 (コアダンプ)

出力でそれが何を意味するのかはわかりませんが、Aborted と表示されているという事実は、私が近いかもしれないと考えさせます。

コードは次のように機能します。

スレッドを作成する スレッド 1 は file1 にアクセスし、書き込みモードで待機します スレッド 2 も file1 にアクセスし、それに変更を加えようとすると、次のようになります

次のステップは、より高い優先度で実行される監視スレッドを作成することです。デッドロックの発生を許可してから解放する方法はありますか? つまり、ミューテックス条件の助けを借りて衝突状況をチェックできる解決策を 1 つ考えていますが、それはデッドロックの回避であり、私が望んでいないことです。デッドロックの発生を許可し、プログラムの中止を防止して、監視スレッドがそれに応じてリソースを解放できるようにする方法はありますか???

これがコードです。繰り返しますが、フォーマットについてお詫び申し上げます。

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<unistd.h>
#include<sched.h>

FILE *fp1;
FILE *fp2;
struct sched_param schedparam1,schedparam2,schedparam3;
int policy=SCHED_RR;
int mutex1[3]= {0,0,0},mutex2[3]= {0,0,0};

void *routine1(void *arg)
{
int a;
printf("before");
fp1= fopen("file1.txt", "w");
usleep(250000);
printf("woke up");
fp2= fopen("file2.txt", "w");
a=fclose(fp1);
printf("%d\n",a);
fclose(fp2);
}

void *routine2(void *arg)
{
printf("asdasd");
fp2=fopen("file2.txt",  "w");
fp1=fopen("file1.txt",  "w");
fclose(fp1);
fclose(fp2);
}

//void *monitor_function(void *arg) //{

void main()
{
pthread_t thread1, thread2, thread3,thread4;
pthread_attr_t at1,at2,at3;
int iret1, iret2,iret3,iret4;
struct timespec tp;
schedparam1.sched_priority = 10;
sched_setscheduler(getpid(),policy,&schedparam1);
sched_rr_get_interval(getpid(),&tp);

printf("\nTime Interval %ld\n",tp.tv_nsec);
\
printf("test");

schedparam1.sched_priority = 10; //Set Nice value of Thread
schedparam2.sched_priority = 10;
schedparam3.sched_priority = 10;

/* Set attributes*/


pthread_attr_init(&at1);
pthread_attr_setinheritsched(&at1, PTHREAD_INHERIT_SCHED); // To inherit parent thread     properties use PTHREAD_INHERIT_SCHED
pthread_attr_setschedpolicy(&at1, policy);
pthread_attr_setschedparam(&at1, &schedparam1);


pthread_attr_init(&at2);
pthread_attr_setinheritsched(&at2, PTHREAD_INHERIT_SCHED);
pthread_attr_setschedpolicy(&at2,policy);
pthread_attr_setschedparam(&at2, &schedparam2);

pthread_attr_init(&at3);
pthread_attr_setinheritsched(&at3, PTHREAD_INHERIT_SCHED);
pthread_attr_setschedpolicy(&at3, policy);
pthread_attr_setschedparam(&at3, &schedparam3);

//iret1 = pthread_create( &thread1, &at1, monitor_function,NULL);

iret2 = pthread_create( &thread2,&at1, routine1,NULL);
iret3 = pthread_create( &thread3,&at2, routine2,NULL);
//iret4 = pthread_create( &thread4,&at3, NULL,NULL);


pthread_join( thread2, NULL);
pthread_join( thread3, NULL);
//pthread_join( thread1, NULL);

printf("\nThread create 1 returns: %d\n",iret1);

printf("Thread create 2 returns: %d\n",iret2);
printf("Thread create 3 returns: %d\n",iret3);
exit(0);



//fp1= fopen("file1.txt", "w");
//fp2= fopen("file2.txt", "w");

}
4

0 に答える 0