mirror of
https://github.com/Hizenberg469/MultiThreading_Part_A.git
synced 2026-04-20 02:22:23 +03:00
pthread cleanup API
This commit is contained in:
@@ -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\
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -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": ""
|
||||||
|
|||||||
Binary file not shown.
@@ -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;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user