pthread cleanup API

This commit is contained in:
2024-03-15 00:54:24 +05:30
parent 2da6c57302
commit 21e905da75
6 changed files with 38 additions and 6 deletions

View File

@@ -1,6 +1,6 @@
1870684405 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\CMakeLists.txt 1870684405 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\CMakeLists.txt
190002877 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\CMakePresets.json 190002877 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\CMakePresets.json
465106864 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\main.c 465106864 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\main.c
1536483663 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\master_slave.c 180745754 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\master_slave.c
393795895 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\master_slave.h 393795895 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\master_slave.h
1551962192 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\ -1338719569 E:\MultiThreading_Part_A\ThreadCancellation_async\master_slave\

View File

@@ -52,7 +52,7 @@
"RelativeDocumentMoniker": "master_slave.c", "RelativeDocumentMoniker": "master_slave.c",
"ToolTip": "E:\\MultiThreading_Part_A\\ThreadCancellation_async\\master_slave\\master_slave.c", "ToolTip": "E:\\MultiThreading_Part_A\\ThreadCancellation_async\\master_slave\\master_slave.c",
"RelativeToolTip": "master_slave.c", "RelativeToolTip": "master_slave.c",
"ViewState": "AQIAAAAAAAAAAAAAAAAAAA0AAAAZAAAA", "ViewState": "AQIAAB4AAAAAAAAAAAAQwC4AAAARAAAA",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000423|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000423|",
"WhenOpened": "2024-03-14T10:31:49.359Z", "WhenOpened": "2024-03-14T10:31:49.359Z",
"EditorCaption": "" "EditorCaption": ""
@@ -65,7 +65,7 @@
"RelativeDocumentMoniker": "main.c", "RelativeDocumentMoniker": "main.c",
"ToolTip": "E:\\MultiThreading_Part_A\\ThreadCancellation_async\\master_slave\\main.c", "ToolTip": "E:\\MultiThreading_Part_A\\ThreadCancellation_async\\master_slave\\main.c",
"RelativeToolTip": "main.c", "RelativeToolTip": "main.c",
"ViewState": "AQIAACEAAAAAAAAAAAAAAAEAAAAAAAAA", "ViewState": "AQIAACQAAAAAAAAAAAAAAAEAAAAAAAAA",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000423|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000423|",
"WhenOpened": "2024-03-14T10:21:23.52Z", "WhenOpened": "2024-03-14T10:21:23.52Z",
"EditorCaption": "" "EditorCaption": ""

View File

@@ -1,5 +1,20 @@
#include "master_slave.h" #include "master_slave.h"
void
memory_cleanup_handler(void* arg) {
printf("%s invoked ...\n", __FUNCTION__);
free(arg);
}
void
file_cleanup_handler(void* arg) {
printf("%s invoked ...\n", __FUNCTION__);
fclose((FILE*)arg);
}
void * void *
write_into_file(void* arg) { write_into_file(void* arg) {
@@ -15,14 +30,21 @@ write_into_file(void* arg) {
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
int* thread_id = (int*)arg; int* thread_id = (int*)arg;
/* When pthread_cancel is invoked and this thread get the
signal to get cancelled, this API is invoked to free up the
resources used by this thread.*/
pthread_cleanup_push(memory_cleanup_handler, arg);
sprintf(file_name, "thread_%d.txt", *thread_id); sprintf(file_name, "thread_%d.txt", *thread_id);
FILE* fptr = fopen(file_name, "w"); FILE* fptr = fopen(file_name, "w");
pthread_cleanup_push(file_cleanup_handler, fptr);
if (!fptr) { if (!fptr) {
printf("Error : Could not open log file %s, errno = %d\n", printf("Error : Could not open log file %s, errno = %d\n",
file_name, errno); file_name, errno);
return 0; pthread_exit(0);
} }
while (1) { while (1) {
@@ -32,6 +54,16 @@ write_into_file(void* arg) {
sleep(1); sleep(1);
} }
fclose(fptr); /* If this thread is successfully executed and the cancellation request
is not invoked till now then, the stack where resource free API are
need to be cleaned.*/
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
/*This is not executed as this thread is in infinite loop
and when the pthread_cancel is executed this thread is cancelled
while it was executing in the loop. Hence, this causes resource
leakage.*/
// fclose(fptr);
return 0; return 0;
} }