Copyright | Will Thompson and Iñaki García Etxebarria |
---|---|
License | LGPL-2.1 |
Maintainer | Iñaki García Etxebarria |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
The Thread
struct represents a running thread. This struct
is returned by threadNew
or threadTryNew
. You can
obtain the Thread
struct representing the current thread by
calling threadSelf
.
GThread is refcounted, see threadRef
and threadUnref
.
The thread represented by it holds a reference while it is running,
and threadJoin
consumes the reference that it is given, so
it is normally not necessary to manage GThread references
explicitly.
The structure is opaque -- none of its fields may be directly accessed.
Synopsis
- newtype Thread = Thread (ManagedPtr Thread)
- newZeroThread :: MonadIO m => m Thread
- threadErrorQuark :: (HasCallStack, MonadIO m) => m Word32
- threadExit :: (HasCallStack, MonadIO m) => Ptr () -> m ()
- threadJoin :: (HasCallStack, MonadIO m) => Thread -> m (Ptr ())
- threadNew :: (HasCallStack, MonadIO m) => Maybe Text -> ThreadFunc -> m Thread
- threadRef :: (HasCallStack, MonadIO m) => Thread -> m Thread
- threadSelf :: (HasCallStack, MonadIO m) => m Thread
- threadTryNew :: (HasCallStack, MonadIO m) => Maybe Text -> ThreadFunc -> m Thread
- threadUnref :: (HasCallStack, MonadIO m) => Thread -> m ()
- threadYield :: (HasCallStack, MonadIO m) => m ()
Exported types
Memory-managed wrapper type.
Instances
Eq Thread Source # | |
GBoxed Thread Source # | |
Defined in GI.GLib.Structs.Thread | |
ManagedPtrNewtype Thread Source # | |
Defined in GI.GLib.Structs.Thread toManagedPtr :: Thread -> ManagedPtr Thread | |
TypedObject Thread Source # | |
Defined in GI.GLib.Structs.Thread | |
HasParentTypes Thread Source # | |
Defined in GI.GLib.Structs.Thread | |
tag ~ 'AttrSet => Constructible Thread tag Source # | |
IsGValue (Maybe Thread) Source # | Convert |
Defined in GI.GLib.Structs.Thread gvalueGType_ :: IO GType gvalueSet_ :: Ptr GValue -> Maybe Thread -> IO () gvalueGet_ :: Ptr GValue -> IO (Maybe Thread) | |
type ParentTypes Thread Source # | |
Defined in GI.GLib.Structs.Thread |
Methods
Click to display all available methods, including inherited ones
errorQuark
threadErrorQuark :: (HasCallStack, MonadIO m) => m Word32 Source #
No description available in the introspection data.
exit
:: (HasCallStack, MonadIO m) | |
=> Ptr () |
|
-> m () |
Terminates the current thread.
If another thread is waiting for us using threadJoin
then the
waiting thread will be woken up and get retval
as the return value
of threadJoin
.
Calling threadExit
with a parameter retval
is equivalent to
returning retval
from the function func
, as given to threadNew
.
You must only call threadExit
from a thread that you created
yourself with threadNew
or related APIs. You must not call
this function from a thread created with another threading library
or or from within a ThreadPool
.
join
:: (HasCallStack, MonadIO m) | |
=> Thread |
|
-> m (Ptr ()) | Returns: the return value of the thread |
Waits until thread
finishes, i.e. the function func
, as
given to threadNew
, returns or threadExit
is called.
If thread
has already terminated, then threadJoin
returns immediately.
Any thread can wait for any other thread by calling threadJoin
,
not just its 'creator'. Calling threadJoin
from multiple threads
for the same thread
leads to undefined behaviour.
The value returned by func
or given to threadExit
is
returned by this function.
threadJoin
consumes the reference to the passed-in thread
.
This will usually cause the Thread
struct and associated resources
to be freed. Use threadRef
to obtain an extra reference if you
want to keep the GThread alive beyond the threadJoin
call.
new
:: (HasCallStack, MonadIO m) | |
=> Maybe Text |
|
-> ThreadFunc |
|
-> m Thread | Returns: the new |
This function creates a new thread. The new thread starts by invoking
func
with the argument data. The thread will run until func
returns
or until threadExit
is called from the new thread. The return value
of func
becomes the return value of the thread, which can be obtained
with threadJoin
.
The name
can be useful for discriminating threads in a debugger.
It is not used for other purposes and does not have to be unique.
Some systems restrict the length of name
to 16 bytes.
If the thread can not be created the program aborts. See
threadTryNew
if you want to attempt to deal with failures.
If you are using threads to offload (potentially many) short-lived tasks,
ThreadPool
may be more appropriate than manually spawning and tracking
multiple GThreads
.
To free the struct returned by this function, use threadUnref
.
Note that threadJoin
implicitly unrefs the Thread
as well.
New threads by default inherit their scheduler policy (POSIX) or thread priority (Windows) of the thread creating the new thread.
This behaviour changed in GLib 2.64: before threads on Windows were not inheriting the thread priority but were spawned with the default priority. Starting with GLib 2.64 the behaviour is now consistent between Windows and POSIX and all threads inherit their parent thread's priority.
Since: 2.32
ref
:: (HasCallStack, MonadIO m) | |
=> Thread |
|
-> m Thread | Returns: a new reference to |
Increase the reference count on thread
.
Since: 2.32
self
:: (HasCallStack, MonadIO m) | |
=> m Thread | Returns: the |
This function returns the Thread
corresponding to the
current thread. Note that this function does not increase
the reference count of the returned struct.
This function will return a Thread
even for threads that
were not created by GLib (i.e. those created by other threading
APIs). This may be useful for thread identification purposes
(i.e. comparisons) but you must not use GLib functions (such
as threadJoin
) on these threads.
tryNew
:: (HasCallStack, MonadIO m) | |
=> Maybe Text |
|
-> ThreadFunc |
|
-> m Thread | Returns: the new |
unref
:: (HasCallStack, MonadIO m) | |
=> Thread |
|
-> m () |
Decrease the reference count on thread
, possibly freeing all
resources associated with it.
Note that each thread holds a reference to its Thread
while
it is running, so it is safe to drop your own reference to it
if you don't need it anymore.
Since: 2.32
yield
threadYield :: (HasCallStack, MonadIO m) => m () Source #
Causes the calling thread to voluntarily relinquish the CPU, so that other threads can run.
This function is often used as a method to make busy wait less evil.