<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Tasks Execution in Multithreaded Program According to the Dependency Graph</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Kostiantyn</forename><surname>Nesterenko</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">National Technical University of Ukraine &quot;Igor Sikorsky Kyiv Polytechnic Institute&quot;</orgName>
								<address>
									<addrLine>37 Prospect Beresteiskyi</addrLine>
									<postCode>03056</postCode>
									<settlement>Kyiv</settlement>
									<country key="UA">Ukraine</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Inna</forename><surname>Stetsenko</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">National Technical University of Ukraine &quot;Igor Sikorsky Kyiv Polytechnic Institute&quot;</orgName>
								<address>
									<addrLine>37 Prospect Beresteiskyi</addrLine>
									<postCode>03056</postCode>
									<settlement>Kyiv</settlement>
									<country key="UA">Ukraine</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Eduard</forename><surname>Zharikov</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">National Technical University of Ukraine &quot;Igor Sikorsky Kyiv Polytechnic Institute&quot;</orgName>
								<address>
									<addrLine>37 Prospect Beresteiskyi</addrLine>
									<postCode>03056</postCode>
									<settlement>Kyiv</settlement>
									<country key="UA">Ukraine</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Tasks Execution in Multithreaded Program According to the Dependency Graph</title>
					</analytic>
					<monogr>
						<idno type="ISSN">1613-0073</idno>
					</monogr>
					<idno type="MD5">9899C3A15E9378C8551C7E77BB8FC4F7</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2025-04-23T18:45+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>Software</term>
					<term>multithreading</term>
					<term>parallel computing</term>
					<term>performance</term>
					<term>reliability</term>
					<term>dependency graph</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Performance is one of the main non-functional requirements for software. As a result of the increase in the number of cores in central processing units in recent decades <ref type="bibr" target="#b0">[1]</ref>, the use of multithreading technology has become a primary means of improving software performance. This study analyzes the problems that arise from developing multithreaded programs and ways to address them. A method for managing the execution of tasks in a multithreaded program based on a given dependency graph is proposed and its implementation in the C++ language is demonstrated. Its aim is to reduce the resource intensity of software development and increase its reliability by addressing problems typical of developing multithreaded programs. The results of experimental research on a test set of tasks are provided, demonstrating increased performance through the use of the proposed method.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1.">Introduction</head><p>The primary goal of using a multithreaded approach during software development is to improve the per formance indicators of the program code. However, another equally important aspect of multithreaded development is maintaining software reliability.</p><p>Using multithreading and synchronization tools can lead to a number of errors: Data race, Race Condition, Deadlock, Livelock, and Starvation <ref type="bibr" target="#b1">[2]</ref>. The presence of these problems in the code during program execution can lead to various consequences, from crashes to unpredictable or incorrect pro gram behavior. Approaches to solving multithreaded issues can vary significantly depending on the programming language, framework, development tools, etc. However, all of them have certain draw backs in their application, as they can negatively impact both the resource intensity of the development process and the performance of the developed program code. These approaches can be fundamentally divided into two types: those that prevent the occurrence of errors and those that allow the engineer to detect errors when they occur.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.">Overview of existing solutions 2.1. Data race</head><p>A Data race occurs when two threads simultaneously access the same memory area, with at least one of them performing a write operation <ref type="bibr" target="#b1">[2]</ref>. A classical mechanism to prevent Data race in multithreaded code is the use of synchronization. By synchronizing data access, it is possible to 14th International Scientific and Practical Conference from Programming UkrPROG'2024, May 14-15, 2024, Kyiv, Ukraine * Corresponding author. † These authors contributed equally.</p><p>k.nesterenko@kpi.ua (K. Nesterenko); stiv.inna@gmail.com (I. Stetsenko); eduard.zharikov-fiot@lll.kpi.ua (E. Zharikov) 0000-0003-3921-4324 (K. Nesterenko); 0000-0002-4601-0058 (I. Stetsenko); 0000-0003-1811-9336 (E. Zharikov) ensure that a specific memory area can only be modified by one thread at a time or that it will not be modified during its reading by a thread. Synchronization tools are an integral part of modern programming languages and continue to evolve, expanding developers' capabilities in managing multithreaded programs and their resources, such as the C++ Concurrency Library <ref type="bibr" target="#b2">[3]</ref>. However, the use of synchronization primitives has its drawbacks, the main one being a reduction in program code performance. Besides the fact that the application of a primitive, such as acquiring a mutex by a thread, takes additional time to execute, a significant amount of time can be lost by threads waiting for a resource protected by a synchronization primitive to be released.</p><p>To improve the performance of program code, developers increasingly use approaches to software development without blocking synchronization primitives <ref type="bibr" target="#b3">[4]</ref>. However, this significantly increases the risk of Data race problems. Various tools are used to detect this problem directly during code execution, such as the Data Race Detector in the Go programming language <ref type="bibr" target="#b4">[5]</ref> or by statically analyzing the written program code <ref type="bibr" target="#b5">[6]</ref>. Recently, there have been developments related to using artificial intelligence to detect Data races in program code <ref type="bibr" target="#b6">[7]</ref>.</p><p>However, using such tools to detect Data races also has drawbacks, as it requires the introduction of additional tools in the software development and testing process, increasing the overall resource intensity of development. Furthermore, after detecting an error, it must be processed and corrected by the developer, and the program tool must be rechecked for new errors.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.2.">Race condition</head><p>Unlike Data race, Race condition is a much more challenging problem to detect because its nature is not technical but semantic. The definition of the term Race condition has long been a subject of discussion, but currently, it can be formalized as a problem arising from the order of operations execution in threads affecting the program's result <ref type="bibr" target="#b7">[8]</ref>.</p><p>Similar to the Data race error, there are certain tools to detect Race condition that warn the developer of the potential occurrence of this problem through static code analysis <ref type="bibr" target="#b8">[9]</ref> or by identifying dangerous patterns during code execution <ref type="bibr" target="#b9">[10]</ref>. However, the accuracy of such detection is often unsatisfactory. These methods are also prone to false positives, requiring the developer to spend additional time and resources verifying the tool's data.</p><p>There are no formalized methods and tools to avoid Race condition in the general case. Reducing the number of such errors or avoiding them can only be achieved by using certain methods and architectural approaches to multithreaded software development <ref type="bibr" target="#b10">[11]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.3.">Deadlock</head><p>Deadlock is a state in a multithreaded program where two or more threads cannot continue their execution due to mutual blocking. The classic strategy to avoid Deadlock is a method where a thread acquires all the resources it needs exclusively at the beginning of its execution <ref type="bibr" target="#b11">[12]</ref>. This prevents the formation of cyclical dependencies between two threads. The thread either executes or waits until all the resources it needs are released. However, this approach negatively impacts performance, as, in the general case, the thread does not need all the resources at each moment of execution, and thus, they could be used by other threads.</p><p>There are many different methods and algorithms for detecting Deadlock. For example, by using timers, it is possible to control the execution time of certain critical sections of code in threads and, if this execution time exceeds a certain threshold, notify the developer of a potential Deadlock <ref type="bibr" target="#b11">[12]</ref>. It is also worth noting that there are Deadlock recovery strategies <ref type="bibr" target="#b12">[13]</ref>, which are extremely important for systems with increased reliability requirements. However, it is evident that recovery strategies negatively affect software performance.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.4.">Starvation</head><p>Starvation is a state in a multithreaded program where one of the threads cannot perform a task due to the inability to access the necessary resources. This state can arise due to design errors in multithreaded programs when resources protected by synchronization primitives are used by threads for a long time. As a result, other threads spend significant time waiting for the necessary resource to be released. To avoid Starvation, prioritization algorithms <ref type="bibr" target="#b13">[14]</ref> or task scheduling <ref type="bibr" target="#b14">[15]</ref> are usually used, guaran teeing that the task will be performed at a certain moment and allowing tasks to be distributed in such a way as to minimize time spent waiting for resources to be freed.</p><p>Various software tools can be used to detect Starvation, examining metrics about the execution time of individual functions in threads and allowing the developer to identify and fix problematic sections of the program code <ref type="bibr" target="#b15">[16]</ref>. Such tools are often integrated into software testing automation processes to constantly monitor the program code state and notify developers of anomalies or performance issues.</p><p>In the result of the analysis of existing problems of multithreading and possible solutions, it can be stated that solving these problems significantly increases the resource intensity of multithreaded software development. Additionally, some of the existing solutions negatively affect the performance of the software, which puts the developer in a difficult position of choosing between performance and reliability of the software product.</p><p>Therefore, the problem of reducing the resource intensity of multithreaded software development without compromising its reliability and performance requires further research.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.">Method for managing the execution of tasks in a multithreaded</head><p>program based on a given dependency graph</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.1.">General description of the method</head><p>The main idea of the method for managing the execution of tasks in a multithreaded program based on a dependency graph is to define the process of executing tasks, which the computations are divided into, as a dependency graph where each vertex corresponds to a specific task, and the graph edges denote dependencies between these tasks. Tasks can be executed in parallel in threads, considering the constraints imposed by the dependencies between them.</p><p>The method for managing the execution of tasks in a multithreaded program based on a dependency graph allows describing the execution process of multithreaded program code in a clear and well structured form and avoids or detects problems arising from the use of task execution synchronization.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2.">Formalized description of the method</head><p>Suppose that for successful program execution, it must complete K tasks that can be described by the set A = {A 0 , …, A K-1 }. If the program's result depends on the order of execution of tasks A i and A j , and only one of the possible results is correct, it means the tasks are in a semantic dependency. Let Y be a directed acyclic graph with vertices G = {G 0 , …, G K-1 } and arcs U. Each task A j from the set A corresponds to the vertex G j of the graph Y. If there is a semantic dependency between tasks A i and A j , or if tasks A i and A j use a shared resource during their execution, then there is a connection between the corresponding vertices G i and G j in the graph, and the arc (G i , G j ) is assigned to it in the graph. In this way, the set of arcs is created:</p><p>(1) Tasks can be dynamically loaded during program execution, creating new vertices and arcs in the graph, and deleted upon successful completion. Thus, each task has a representation in the dependency graph from creation to completion. Since the start of the task, the correspondent vertex is not available for creating a new arc. When a new task is created, the added arcs should not form a cycle in a graph. If all the added arcs are directed to the new vertex (G i , G x ) then the new graph will be acyclic. Indeed, if no path can be built through the new vertex then a new cycle cannot be built in the graph. Similarly, if all added arcs are directed from the new vertex (Gx, Gj) then the new graph will be acyclic. However, if among added arcs are both cases, to and from the new vertex, then the following condition should be checked. For each pair of added arcs (G i , G x ) and (G x , G j ), a path from G j to G i should not be found in graph U:</p><p>(2) where P is a path in graph Y, is an existing directed connection between vertices in graph. Indeed, if the path exists, then the following cycle would be found in a new graph:</p><p>(3)</p><p>Task A x can be executed in the program if and only if there is no arc (G i , G x ) in the dependency graph. If task Ax is executed, it is deleted from the graph along with the arcs (G x , G j ):</p><p>(4) Program execution is considered successful when the set of vertices in the dependency graph Y is empty at the end of the program, meaning that all tasks loaded for execution have been completed: .</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.3.">Method based software</head><p>The basis for implementing the method of task execution management in a multithreaded program based on a dependency graph is the implementation of the GraphManager class (Figure <ref type="figure" target="#fig_0">1</ref>), which will be responsible for the order of task execution. Accordingly, this class must control the list of available tasks, select tasks that can be executed, and update the existing dependencies after their execution. To represent a task as a vertex in the dependency graph, it is necessary to create a GraphNode class, which will contain information about the task to be executed and a list of tasks it depends on and tasks that depend on it. Dependencies between tasks are established by the developer after the corresponding GraphNode class objects have been added to the GraphManager. During the implementation of the method, the developer must represent the types of tasks available in the program as separate SomeConcreteJob classes, which are descendants of the abstract AbstractJob class. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.4.">Resolving concurrency issues using a method</head><p>To avoid the Race condition problem, developers need only specify dependencies between tasks, ensuring the correct sequencing necessary for program output integrity. This method guarantees that tasks with established dependencies will execute in the specified order relative to each other.</p><p>To address Data race issues and improve performance by reducing the need for synchronization primitives to protect specific objects, developers can establish dependencies among tasks requiring exclusive access to certain resources while allowing parallel execution of tasks that do not modify shared resources.</p><p>While the proposed method does not eliminate Deadlock and Livelock issues entirely, it simplifies implementing mechanisms to detect these issues prior to executing the dependency graph. Dependency graph edges can denote not only semantic dependencies between tasks but also dependencies between tasks requiring exclusive access to shared resources. Deadlock problems arise when synchronized resources are mutually dependent between two threads. With this method, detecting potential Deadlocks reduces to finding cycles in the graph, a problem for which many algorithms exist <ref type="bibr" target="#b16">[17]</ref>. Since cycle detection need not occur before every program execution but only after changes to the dependency graph, applying a depth-first search-based cycle detection algorithm suffices for this method.</p><p>Similarly, this approach applies to Livelock issues. Absence of cycles in the graph and construction of dependencies among tasks needing exclusive access to shared resources prevent such issues during program execution. The proposed method does not entirely prevent Starvation problems. However, it minimizes them and facilitates implementing runtime monitoring mechanisms without relying on external control mechanisms. Task execution management based on the dependency graph allows developers to configure the graph so that no task waits for the release of a specific shared resource after starting its execution. Instead, such a task simply will not start until the resource becomes available, adhering to task dependencies. Consequently, system resources can be directed toward executing tasks currently without dependencies or those whose dependencies have already been fulfilled.</p><p>Nevertheless, this method does not prevent scenarios where a task depends on many other tasks, thereby preventing them from executing until it completes successfully. Detecting such issues involves implementing mechanisms to monitor the graph's state, recording execution times, waiting times, and other relevant data for each task. With this information, developers can modify the code to address problematic areas and improve the performance of the software tool.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.">Experimental investigation of the efficiency of task execution management method in a multithreaded program based on a specified dependency graph 4.1. Description of the test software</head><p>To evaluate the effectiveness of the proposed method, a program was developed in C++ that, using the Strategy design pattern, allows executing the same set of tasks either through a conventional implementation of a multithreaded program or based on a dependency graph. Thread management utilizes the Thread Pool design pattern (Figure <ref type="figure" target="#fig_1">2</ref>).</p><p>To enable configuration of which approach to use for task execution, the IJobManager interface (Figure <ref type="figure" target="#fig_2">3</ref>) was created. This interface encapsulates the mechanism through which the Thread Pool selects the next task for execution.  The IJobManager interface is implemented in the DefaultJobManager class (Figure <ref type="figure" target="#fig_3">4</ref>) and the GraphJob Manager class (Figure <ref type="figure" target="#fig_4">5</ref>). The DefaultJobManager class is implemented using a traditional queue based on the "first in, first out" (FIFO) principle. Accordingly, it reflects the classic scenario of writing a multithreaded program where synchronization responsibility lies entirely on synchronization primitives.  The GraphJobManager, in turn, is implemented using the proposed method. Within the class, there is a data structure called m_graphMap, which associates each task with a corresponding node in the graph, described using the GraphNode class (Figure <ref type="figure" target="#fig_5">6</ref>). Each instance of the GraphNode class internally stores the number of unresolved dependencies for its corresponding task, or in other words, the number of edges entering this vertex in the graph. Additionally, each instance holds pointers to other instances of the GraphNode class, effectively describing edges leaving this vertex in the graph. When all dependencies for a graph vertex are satisfied, it is moved to the execution queue in the GraphJobManager class. The GraphJobManager class also includes the AddJobDependency function, which allows specifying dependencies between tasks, effectively creating a new edge in the dependency graph.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.2.">Description of the test data and testing scenarios</head><p>To test the Thread Pool, a pool of 4 threads was configured. The test set of tasks consists of 4 groups of 100 tasks each, which can be represented as sets А ={A 0 , …, A 99 }, B = {B 0 , …, B 99 }, C = {C 0 , …,C 99 }, D = {D 0 , …, D 99 }. Within each group, simulating real-world conditions for a multithreaded task, it is assumed that there is a specific resource for which each task obtains exclusive access using a mutex during its execution. After obtaining access, the task waits for 10 ms, simulating computation using the Busy wait approach <ref type="bibr" target="#b17">[18]</ref>, and successfully completes its execution. The use of Busy wait specifically avoids the impact of thread optimization mechanisms implemented in the operating system on the obtained result.</p><p>To obtain more accurate results for comparison, the test set of tasks is executed 100 times for each implementation. The following metrics are collected: fastest execution time, slowest execution time, and average execution time.</p><p>To measure the execution time of the program for computing the specified set of tasks using the dependency graph constructed based on the proposed method, the GraphJobManager will be used instead of the DefaultJobManager. When tasks are added in GraphJobManager, a graph node described by the GraphNode class is created for each task. Then, using the AddJobDependency function, dependencies between tasks are established, effectively adding edges in the dependency graph. In this case, the dependency object is the resource allocated for each group of tasks. Thus, using the AddJobDependency function, dependencies between tasks will be created as follows: each task Ai depends on the execution of task Ai-1, Bi depends on Bi-1, Ci depends on Ci-1, and Di depends on Di-1 where i ∈ <ref type="bibr" target="#b0">[1,</ref><ref type="bibr">99]</ref>.</p><p>It is worth noting that since the classical approach to executing multithreaded tasks is implemented using a queue, the total task execution time depends on their order in this queue. Accordingly, three testing scenarios were developed for the classical approach: best case, worst case, and realistic.</p><p>The best-case scenario considers tasks in the queue arranged such that the time spent waiting for access to resources by tasks is minimized. This scenario corresponds to arranging tasks in the queue where each belongs to a different group and requires a different resource for execution. Thus, the sequence of tasks in the queue will look like: {A 0 , B 0 , C 0 , D 0 , ..., A 99 , B 99 , C 99 , D 99 }.</p><p>The worst-case scenario considers tasks in the queue arranged such that the time spent waiting for access to resources by tasks is maximized. This scenario corresponds to arranging tasks in the queue where groups of tasks are sequentially placed in the queue. Thus, the sequence of tasks in the queue will look like: {A 0 , ..., A 99 , B 0 , ..., B 99 , C 0 , ..., C 99 , D 0 , ..., D 99 }. The realistic scenario considers tasks randomly placed in the queue, simulating conditions closer to those that may occur during real program execution.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Testing results</head><p>The experimental results represented in Table <ref type="table" target="#tab_0">1</ref> demonstrate that compared to the realistic and worst case execution scenarios, the proposed method showed significantly higher performance. This result was achieved because a proposed method allows developers to specify the task execution order by introducing dependencies between them, thereby reducing the impact of synchronization mechanisms on the overall program execution time. The experimental results of the best-case, realistic-case, and the case of dependency graph scenarios are represented in detail in Figure <ref type="figure" target="#fig_6">7</ref>. The performance evaluation was done on 100 executions of the program.</p><p>In the best-case execution scenario, the results show minimal performance difference in favor of the classical approach. This can be easily explained by the fact that in this case, the task execution order is identical in both approaches, but the proposed method incurs additional time for graph construction and update. However, considering that such a scenario may rarely occur in real-world conditions.</p><p>Therefore, according to the results of the experimental study, it has been proven that the proposed method allows to increase the performance of the test program on average by approximately 35%, compared to the classical approach: (1542.71 − 1010.74) / 1542.71 •100% = 34.48%. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.">Conclusion</head><p>An analysis of the challenges arising during the development of multithreaded programs was con ducted. For each issue, current methods of resolution were discussed, outlining their advantages and disadvantages.</p><p>A method for managing task execution in a multithreaded program based on a specified dependency graph was proposed. The general idea, formal description, and programmatic details of the method were provided, along with how this method addresses the identified issues and the advantages it provides to developers compared to existing methods.</p><p>A C++ program and a suite of tasks were developed to measure the performance of the proposed method against the classical approach of executing tasks in threads. After analyzing the obtained results, it was concluded that the proposed method improves the performance of the test program on average by 35% compared to the classical approach.</p><p>Future plans include further development of the method's use for developing multithreaded programs based on dependency graphs, aiming to create a comprehensive development environment for such programs.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Figure 1 :</head><label>1</label><figDesc>Figure 1: UML diagram of method implementation.</figDesc><graphic coords="5,213.16,76.60,184.32,311.28" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Figure 2 :</head><label>2</label><figDesc>Figure 2: ThreadPool template implementation.</figDesc><graphic coords="6,109.24,386.20,376.56,332.40" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Figure 3 :</head><label>3</label><figDesc>Figure 3: Class IjobManager.</figDesc><graphic coords="7,148.84,72.04,297.60,194.64" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>Figure 4 :</head><label>4</label><figDesc>Figure 4: Class DefaultJobManager.</figDesc><graphic coords="7,143.80,373.48,307.44,234.96" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>Figure 5 :</head><label>5</label><figDesc>Figure 5: Class GraphJobManager.</figDesc><graphic coords="8,139.00,72.04,317.04,372.00" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>Figure 6 :</head><label>6</label><figDesc>Figure 6: Class GraphNode.</figDesc><graphic coords="9,156.52,72.04,282.24,340.32" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_6"><head>Figure 7 :</head><label>7</label><figDesc>Figure 7: Experimental performance evaluation of task execution.</figDesc><graphic coords="11,85.96,72.52,210.24,154.08" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_0"><head>Table 1</head><label>1</label><figDesc>Results of experimental performance evaluation of task execution under various processing scenarios</figDesc><table><row><cell>Task execution</cell><cell></cell><cell>Execution time, ms</cell><cell></cell></row><row><cell>scenario</cell><cell>Fastest</cell><cell>Slowest</cell><cell>Average</cell></row><row><cell>Best case</cell><cell>1003.42</cell><cell>1008.47</cell><cell>1004.67</cell></row><row><cell>Worst case</cell><cell>3915.63</cell><cell>3919.09</cell><cell>3917.58</cell></row><row><cell>Realistic</cell><cell>1453.54</cell><cell>1643.43</cell><cell>1542.71</cell></row><row><cell>Dependency graph</cell><cell>1009.00</cell><cell>1013.64</cell><cell>1010.74</cell></row></table></figure>
		</body>
		<back>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">The future of microprocessors</title>
		<author>
			<persName><forename type="first">S</forename><surname>Borkar</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Chien</surname></persName>
		</author>
		<idno type="DOI">10.1145/1941487.1941507</idno>
	</analytic>
	<monogr>
		<title level="j">Commun. ACM</title>
		<imprint>
			<biblScope unit="volume">54</biblScope>
			<biblScope unit="issue">5</biblScope>
			<biblScope unit="page" from="67" to="77" />
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Multithreaded programming challenges, current practice, and languages/tools support</title>
		<author>
			<persName><forename type="first">Y</forename><surname>Lin</surname></persName>
		</author>
		<idno type="DOI">10.1109/HOTCHIPS.2006.7477737</idno>
	</analytic>
	<monogr>
		<title level="m">IEEE Hot Chips 18 Symposium (HCS)</title>
				<meeting><address><addrLine>Stanford, CA</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2006">2006. 2006</date>
			<biblScope unit="page" from="1" to="134" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Multithreaded Programming with C++</title>
		<author>
			<persName><forename type="first">M</forename><surname>Gregoire</surname></persName>
		</author>
		<idno type="DOI">10.1002/9781119695547.ch27</idno>
	</analytic>
	<monogr>
		<title level="m">Professional C++, Fourth Edition</title>
				<imprint>
			<date type="published" when="2021">2021</date>
			<biblScope unit="page" from="915" to="967" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Concurrent programming without locks</title>
		<author>
			<persName><forename type="first">K</forename><surname>Fraser</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Harris</surname></persName>
		</author>
		<idno type="DOI">10.1145/1233307.1233309</idno>
	</analytic>
	<monogr>
		<title level="j">ACM Trans. Comput. Syst</title>
		<imprint>
			<biblScope unit="volume">25</biblScope>
			<biblScope unit="issue">2</biblScope>
			<date type="published" when="2007">2007</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">A study of real-world data races in golang</title>
		<author>
			<persName><forename type="first">M</forename><surname>Chabbi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Ramanathan</surname></persName>
		</author>
		<idno type="DOI">10.1145/3519939.3523720</idno>
	</analytic>
	<monogr>
		<title level="m">PLDI 2022: Proceedings of the 43rd ACM SIGPLAN International Conference on Programming Language Design and Implementation</title>
				<imprint>
			<date type="published" when="2022">2022</date>
			<biblScope unit="page" from="474" to="489" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Fast and accurate static data race detection for concurrent programs</title>
		<author>
			<persName><forename type="first">V</forename><surname>Kahlon</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Y</forename><surname>Yang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Sankaranarayanan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Gupta</surname></persName>
		</author>
		<idno type="DOI">10.1007/978-3-540-73368-3_26</idno>
	</analytic>
	<monogr>
		<title level="j">Lecture Notes in Computer Science</title>
		<imprint>
			<biblScope unit="volume">4590</biblScope>
			<biblScope unit="page" from="226" to="239" />
			<date type="published" when="2007">2007</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Data race detection using large language models</title>
		<author>
			<persName><forename type="first">L</forename><surname>Chen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">X</forename><surname>Ding</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Emani</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Vanderbruggen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P.-H</forename><surname>Lin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Liao</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the SC&apos;23 Workshops of The International Conference on High Performance Computing, Network, Storage, and Analysis</title>
				<meeting>the SC&apos;23 Workshops of The International Conference on High Performance Computing, Network, Storage, and Analysis</meeting>
		<imprint>
			<date type="published" when="2023">2023</date>
			<biblScope unit="page" from="215" to="223" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">What are race conditions? -some issues and formalizations</title>
		<author>
			<persName><forename type="first">R</forename><surname>Netzer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Miller</surname></persName>
		</author>
		<idno type="DOI">10.1145/130616.130623</idno>
	</analytic>
	<monogr>
		<title level="j">ACM letters on programming languages and systems</title>
		<imprint>
			<biblScope unit="volume">1</biblScope>
			<biblScope unit="page" from="74" to="88" />
			<date type="published" when="1992">1992</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">Detecting race conditions in large programs</title>
		<author>
			<persName><forename type="first">C</forename><surname>Flanagan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Freund</surname></persName>
		</author>
		<idno type="DOI">10.1145/379605.379687</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2001 ACM SIGPLAN-SIGSOFT workshop on Program analysis for software tools and engineering</title>
				<meeting>the 2001 ACM SIGPLAN-SIGSOFT workshop on Program analysis for software tools and engineering</meeting>
		<imprint>
			<date type="published" when="2001">2001</date>
			<biblScope unit="page" from="90" to="96" />
		</imprint>
	</monogr>
	<note>PASTE &apos;01</note>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">Efficient identification of race condition vulnerability in C code by abstract interpretation and value analysis</title>
		<author>
			<persName><forename type="first">M</forename><surname>Yousaf</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Sindhu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Arif</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Rehman</surname></persName>
		</author>
		<idno type="DOI">10.1109/ICCWS53234.2021.9702954</idno>
	</analytic>
	<monogr>
		<title level="m">2021 International Conference on Cyber Warfare and Security (ICCWS)</title>
				<meeting><address><addrLine>Islamabad, Pakistan</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2021">2021</date>
			<biblScope unit="page" from="70" to="75" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">The manager workers pattern</title>
		<author>
			<persName><forename type="first">J</forename><surname>Ortega-Arjona</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 9th European Conference on Pattern Languages of Programms (EuroPLoP &apos;2004)</title>
				<meeting>the 9th European Conference on Pattern Languages of Programms (EuroPLoP &apos;2004)<address><addrLine>Irsee, Germany</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2004">July 7-11, 2004</date>
			<biblScope unit="page" from="53" to="64" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">Deadlock detection in distributed systems</title>
		<author>
			<persName><forename type="first">M</forename><surname>Singhal</surname></persName>
		</author>
		<idno type="DOI">10.1109/2.43525</idno>
	</analytic>
	<monogr>
		<title level="j">Computer</title>
		<imprint>
			<biblScope unit="volume">22</biblScope>
			<biblScope unit="page" from="37" to="48" />
			<date type="published" when="1989">1989</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">A distributed deadlock detection and resolution algorithm based on a hybrid wait-for graph and probe generation scheme</title>
		<author>
			<persName><forename type="first">Y</forename><surname>Park</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Scheuermann</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H.-L</forename><surname>Tung</surname></persName>
		</author>
		<idno type="DOI">10.1145/221270.221648</idno>
	</analytic>
	<monogr>
		<title level="m">CIKM &apos;95: Proceedings of the fourth international conference on Information and knowledge management</title>
				<imprint>
			<date type="published" when="1995">1995</date>
			<biblScope unit="page" from="378" to="386" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<analytic>
		<title level="a" type="main">Starvation avoidance for priority scheduling</title>
		<author>
			<persName><forename type="first">R</forename><surname>Jabbour</surname></persName>
		</author>
		<author>
			<persName><forename type="first">I</forename><surname>Elhajj</surname></persName>
		</author>
		<author>
			<persName><surname>Saf-Ps</surname></persName>
		</author>
		<idno type="DOI">10.1109/SSD.2008.4632789</idno>
	</analytic>
	<monogr>
		<title level="m">2008 5th International Multi-Conference on Systems, Signals and Devices</title>
				<meeting><address><addrLine>Amman, Jordan</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2008">2008</date>
			<biblScope unit="page" from="1" to="6" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">Starvation avoidance task scheduling algorithm for heterogeneous computing systems</title>
		<author>
			<persName><forename type="first">A</forename><surname>Gawanmeh</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W</forename><surname>Mansoor</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Abed</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Kablaoui</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename></persName>
		</author>
		<idno type="DOI">10.1109/CSCI54926.2021.00339</idno>
	</analytic>
	<monogr>
		<title level="m">2021 International Conference on Computational Science and Computational Intelligence (CSCI)</title>
				<meeting><address><addrLine>Las Vegas, NV, USA</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2021">2021</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title level="a" type="main">A model for systematic monitoring and debugging of starvation bugs in multicore software</title>
		<author>
			<persName><forename type="first">S</forename><surname>Abbaspour</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Saadatmand</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Eldh</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Sundmark</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Hansson</surname></persName>
		</author>
		<idno type="DOI">10.1145/2975954.2975958</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 1st International Workshop on Specification, Comprehension, Testing, and Debugging of Concurrent Programs</title>
				<meeting>the 1st International Workshop on Specification, Comprehension, Testing, and Debugging of Concurrent Programs</meeting>
		<imprint>
			<date type="published" when="2016">2016</date>
			<biblScope unit="page" from="7" to="11" />
		</imprint>
	</monogr>
	<note>SCTDCP 2016</note>
</biblStruct>

<biblStruct xml:id="b16">
	<analytic>
		<title level="a" type="main">Cycle detection algorithms and their applications</title>
		<author>
			<persName><forename type="first">A</forename><surname>Nesterenko</surname></persName>
		</author>
		<idno type="DOI">10.1007/s10958-012-0755-x</idno>
	</analytic>
	<monogr>
		<title level="j">Journal of Mathematical Sciences</title>
		<imprint>
			<biblScope unit="volume">182</biblScope>
			<biblScope unit="page" from="518" to="526" />
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<analytic>
		<title level="a" type="main">Busy wait analysis</title>
		<author>
			<persName><forename type="first">J</forename><surname>Blieberger</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Burgstaller</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Scholz</surname></persName>
		</author>
		<idno type="DOI">10.1007/3-540-44947-7_10</idno>
	</analytic>
	<monogr>
		<title level="j">Lecture Notes in Computer Science</title>
		<imprint>
			<biblScope unit="volume">2655</biblScope>
			<biblScope unit="page" from="142" to="152" />
			<date type="published" when="2003">2003</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
