Introduces a minimal ThreadPool implementation using Tasks

Introduced classes

class JoinTask

pthreads :: JoinTask

A Task which is joinable, meaning it can return a value and if the value is not set yet, it blocks the execution
private class PoolThread

pthreads :: PoolThread

A Thread running in a threadpool
class ThreadPool

pthreads :: ThreadPool

A simple ThreadPool implemented with an array

Redefined classes

redef interface Task

pthreads :: threadpool $ Task

Task with a main method to be implemented by subclasses

All class definitions

class JoinTask

pthreads $ JoinTask

A Task which is joinable, meaning it can return a value and if the value is not set yet, it blocks the execution
private class PoolThread

pthreads $ PoolThread

A Thread running in a threadpool
redef interface Task

pthreads :: threadpool $ Task

Task with a main method to be implemented by subclasses
class ThreadPool

pthreads $ ThreadPool

A simple ThreadPool implemented with an array
package_diagram pthreads::threadpool threadpool pthreads::concurrent_collections concurrent_collections pthreads::threadpool->pthreads::concurrent_collections pthreads pthreads pthreads::concurrent_collections->pthreads ...pthreads ... ...pthreads->pthreads nitcorn::restful restful nitcorn::restful->pthreads::threadpool pthreads::jointask_example jointask_example pthreads::jointask_example->pthreads::threadpool pthreads::threadpool_example threadpool_example pthreads::threadpool_example->pthreads::threadpool nitcorn::restful_annot restful_annot nitcorn::restful_annot->nitcorn::restful nitcorn::restful_annot... ... nitcorn::restful_annot...->nitcorn::restful_annot a_star-m a_star-m a_star-m->pthreads::jointask_example a_star-m->pthreads::threadpool_example a_star-m... ... a_star-m...->a_star-m

Ancestors

module abstract_collection

core :: abstract_collection

Abstract collection classes and services.
module abstract_text

core :: abstract_text

Abstract class for manipulation of sequences of characters
module array

core :: array

This module introduces the standard array structure.
module bitset

core :: bitset

Services to handle BitSet
module bytes

core :: bytes

Services for byte streams and arrays
module circular_array

core :: circular_array

Efficient data structure to access both end of the sequence.
module codec_base

core :: codec_base

Base for codecs to use with streams
module codecs

core :: codecs

Group module for all codec-related manipulations
module collection

core :: collection

This module define several collection classes.
module core

core :: core

Standard classes and methods used by default by Nit programs and libraries.
module environ

core :: environ

Access to the environment variables of the process
module error

core :: error

Standard error-management infrastructure.
module exec

core :: exec

Invocation and management of operating system sub-processes.
module file

core :: file

File manipulations (create, read, write, etc.)
module fixed_ints

core :: fixed_ints

Basic integers of fixed-precision
module fixed_ints_text

core :: fixed_ints_text

Text services to complement fixed_ints
module flat

core :: flat

All the array-based text representations
module gc

core :: gc

Access to the Nit internal garbage collection mechanism
module hash_collection

core :: hash_collection

Introduce HashMap and HashSet.
module iso8859_1

core :: iso8859_1

Codec for ISO8859-1 I/O
module kernel

core :: kernel

Most basic classes and methods.
module list

core :: list

This module handle double linked lists
module math

core :: math

Mathematical operations
module native

core :: native

Native structures for text and bytes
module numeric

core :: numeric

Advanced services for Numeric types
module protocol

core :: protocol

module pthreads

pthreads :: pthreads

Main POSIX threads support and intro the classes Thread, Mutex and Barrier
module queue

core :: queue

Queuing data structures and wrappers
module range

core :: range

Module for range of discrete objects.
module re

core :: re

Regular expression support for all services based on Pattern
module ropes

core :: ropes

Tree-based representation of a String.
module sorter

core :: sorter

This module contains classes used to compare things and sorts arrays.
module stream

core :: stream

Input and output streams of characters
module text

core :: text

All the classes and methods related to the manipulation of text entities
module time

core :: time

Management of time and dates
module union_find

core :: union_find

union–find algorithm using an efficient disjoint-set data structure
module utf8

core :: utf8

Codec for UTF-8 I/O

Parents

module concurrent_collections

pthreads :: concurrent_collections

Introduces thread-safe concurrent collections

Children

module jointask_example

pthreads :: jointask_example

Simple example of joinable task using threadpool
module restful

nitcorn :: restful

Support module for the nitrestful tool and the restful annotation
module threadpool_example

pthreads :: threadpool_example

Simple example using threadpool

Descendants

module a_star-m

a_star-m

module restful_annot

nitcorn :: restful_annot

Example for the restful annotation documented at lib/nitcorn/restful.nit
# Introduces a minimal ThreadPool implementation using Tasks
module threadpool

intrude import pthreads
import concurrent_collections

# A simple ThreadPool implemented with an array
class ThreadPool
	private var queue = new ConcurrentList[Task]
	private var mutex = new Mutex
	private var cond = new NativePthreadCond
	private var threads = new Array[PoolThread]

	# Number of threads used, can only grow after the first call to `execute`
	var nb_threads = 5 is optional, writable

	private fun create_threads do
		while threads.length < nb_threads do
			var t = new PoolThread(queue, mutex, cond)
			t.start
			threads.add t
		end
	end

	# Adds a Task into the queue
	fun execute(task: Task) do
		create_threads
		queue.push(task)
		cond.signal
	end

	# Join all threads, waiting for all tasks to be completed
	fun join_all do
		# Wait
		for t in threads do t.join

		# Reset
		threads.clear
	end
end

# A Thread running in a threadpool
private class PoolThread
	super Thread

	var queue: ConcurrentList[Task]
	var mutex: Mutex
	var cond : NativePthreadCond

	redef fun main do
		loop
			var t = null
			mutex.lock
			if queue.is_empty then cond.wait(mutex.native.as(not null))
			if not queue.is_empty then
				t = queue.shift
			end
			mutex.unlock
			if t != null then
				t.main
				t.after_main
			end
		end
	end
end

redef class Task
	# Additional work executed after `main` from a `ThreadPool`
	private fun after_main do end
end

# A Task which is joinable, meaning it can return a value and if the value is not set yet, it blocks the execution
class JoinTask
	super Task

	# Is `self` done?
	var is_done = false

	private var mutex = new Mutex
	private var cond: nullable NativePthreadCond = null

	# Return immediatly if the task terminated, or block waiting for `self` to terminate
	fun join do
		mutex.lock
		if not is_done then
			var cond = new NativePthreadCond
			self.cond = cond
			cond.wait(mutex.native.as(not null))
		end
		mutex.unlock
	end

	redef fun after_main do
		# TODO move this at the end of main so all `JoinTask` can be joined
		# no matter what calls `main`.

		mutex.lock
		is_done = true
		var tcond = cond
		if tcond != null then tcond.signal
		mutex.unlock
	end
end
lib/pthreads/threadpool.nit:15,1--117,3