diff options
| -rw-r--r-- | docs/man/libnng.3.adoc | 6 | ||||
| -rw-r--r-- | docs/man/nng_thread_create.3supp.adoc | 86 | ||||
| -rw-r--r-- | docs/man/nng_thread_destroy.3supp.adoc | 46 | ||||
| -rw-r--r-- | docs/man/nng_thread_set_name.3supp.adoc | 47 | ||||
| -rw-r--r-- | docs/ref/SUMMARY.md | 1 | ||||
| -rw-r--r-- | docs/ref/api/thr/index.md | 1 | ||||
| -rw-r--r-- | docs/ref/api/thr/nng_thread.md | 84 |
7 files changed, 89 insertions, 182 deletions
diff --git a/docs/man/libnng.3.adoc b/docs/man/libnng.3.adoc index 5748546d..1ec270f2 100644 --- a/docs/man/libnng.3.adoc +++ b/docs/man/libnng.3.adoc @@ -298,9 +298,9 @@ as a convenience to aid in creating portable applications. |xref:nng_opts_parse.3supp.adoc[nng_opts_parse()]|parse command line options // |xref:nng_random.3supp.adoc[nng_random()]|get random number // |xref:nng_socket_pair.3supp.adoc[nng_socket_pair()]|create connected pair of BSD sockets -|xref:nng_thread_create.3supp.adoc[nng_thread_create()]|create thread -|xref:nng_thread_destroy.3supp.adoc[nng_thread_destroy()]|reap thread -|xref:nng_thread_set_name.3supp.adoc[nng_thread_set_name()]|set thread name +// |xref:nng_thread_create.3supp.adoc[nng_thread_create()]|create thread +// |xref:nng_thread_destroy.3supp.adoc[nng_thread_destroy()]|reap thread +// |xref:nng_thread_set_name.3supp.adoc[nng_thread_set_name()]|set thread name |=== === Byte Streams diff --git a/docs/man/nng_thread_create.3supp.adoc b/docs/man/nng_thread_create.3supp.adoc deleted file mode 100644 index 10b02e22..00000000 --- a/docs/man/nng_thread_create.3supp.adoc +++ /dev/null @@ -1,86 +0,0 @@ -= nng_thread_create(3supp) -// -// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_thread_create - create thread - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> - -typedef struct nng_thread nng_thread; - -int nng_thread_create(nng_thread **thrp, void (*func)(void *), void *arg); ----- - -== DESCRIPTION - -The `nng_thread_create()` function creates a single thread of execution, -running _func_ with the argument _arg_. -The thread is started immediately. -A pointer to the thread object is returned in _thrp_. - -The intention of this program is to facilitate writing parallel programs. -Threads created by this program will be based upon the underlying -threading mechanism of the system that _NNG_ is running on. -This may include use of coroutines. - -Using threads created by this function can make it easy to write -programs that use simple sequential execution, using functions in the -_NNG_ suite that would otherwise normally wait synchronously for completion. - -When the thread is no longer needed, the -xref:nng_thread_destroy.3supp.adoc[`nng_thread_destroy()`] -function should be used to reap it. -(This function will block waiting for _func_ to return.) - -IMPORTANT: Thread objects created by this function may not be real system -level threads capable of performing blocking I/O operations using normal blocking -system calls. -If use of blocking system calls is required (not including APIs provided -by the _NNG_ library itself of course), then real OS-specific threads -should be created instead (such as with `pthread_create()` or similar -functions.) - -IMPORTANT: Thread objects created by this function cannot be passed -to any system threading functions. - -TIP: The system may impose limits on the number of threads that can be -created. -Typically applications should not create more than a dozen of these. -If greater concurrency or scalability is needed, consider instead using -an asynchronous model using xref:nng_aio.5.adoc[`nng_aio`] structures. - -TIP: Threads can be synchronized using -xref:nng_mtx_alloc.3supp.adoc[mutexes] and -xref:nng_cv_alloc.3supp.adoc[condition variables]. - -== RETURN VALUES - -This function returns 0 on success, and non-zero otherwise. - -== ERRORS - -[horizontal] -`NNG_ENOMEM`:: Insufficient free memory exists. - -== SEE ALSO - -[.text-left] -xref:nng_strerror.3.adoc[nng_strerror(3)], -xref:nng_cv_alloc.3supp.adoc[nng_cv_alloc(3supp)], -xref:nng_mtx_alloc.3supp.adoc[nng_mtx_alloc(3supp)], -xref:nng_thread_destroy.3supp.adoc[nng_thread_destroy(3supp)], -xref:nng_aio.5.adoc[nng_aio(5)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_thread_destroy.3supp.adoc b/docs/man/nng_thread_destroy.3supp.adoc deleted file mode 100644 index 7caa1cd3..00000000 --- a/docs/man/nng_thread_destroy.3supp.adoc +++ /dev/null @@ -1,46 +0,0 @@ -= nng_thread_destroy(3supp) -// -// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2018 Capitar IT Group BV <info@capitar.com> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_thread_destroy - reap thread - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> - -void nng_thread_destroy(nng_thread *thread); ----- - -== DESCRIPTION - -The `nng_thread_destroy()` function reaps the _thread_. -It waits for the thread function to return, and then deallocates -the resources for the thread. - -IMPORTANT: Do not call this function from the thread function itself, -or a deadlock will occur. - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_thread_create.3supp.adoc[nng_thread_create(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/man/nng_thread_set_name.3supp.adoc b/docs/man/nng_thread_set_name.3supp.adoc deleted file mode 100644 index fb54fb02..00000000 --- a/docs/man/nng_thread_set_name.3supp.adoc +++ /dev/null @@ -1,47 +0,0 @@ -= nng_thread_set_name(3supp) -// -// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech> -// -// This document is supplied under the terms of the MIT License, a -// copy of which should be located in the distribution where this -// file was obtained (LICENSE.txt). A copy of the license may also be -// found online at https://opensource.org/licenses/MIT. -// - -== NAME - -nng_thread_set_name - set thread name - -== SYNOPSIS - -[source, c] ----- -#include <nng/nng.h> - -void nng_thread_set_name(nng_thread *thread, const char *name); ----- - -== DESCRIPTION - -The `nng_thread_set_name()` function attempts to set the name for the _thread_ to _name_. - -If _thread_ is `NULL`, then the name is set for the current thread. - -Support for this, and how names are exposed, varies between platform implementations. -This function is intended to facilitate debugging applications that may have many threads. - -TIP: Internal threads created by _NNG_ will have names beginning with `nng:`. - -== RETURN VALUES - -None. - -== ERRORS - -None. - -== SEE ALSO - -[.text-left] -xref:nng_thread_create.3supp.adoc[nng_thread_create(3supp)], -xref:nng.7.adoc[nng(7)] diff --git a/docs/ref/SUMMARY.md b/docs/ref/SUMMARY.md index e39a9969..25076381 100644 --- a/docs/ref/SUMMARY.md +++ b/docs/ref/SUMMARY.md @@ -6,6 +6,7 @@ - [nng_cv](./api/thr/nng_cv.md) - [nng_mtx](./api/thr/nng_mtx.md) + - [nng_thread](./api/thr/nng_thread.md) - [Utility Functions](./api/util/index.md) diff --git a/docs/ref/api/thr/index.md b/docs/ref/api/thr/index.md index 5f60ed66..28d628d9 100644 --- a/docs/ref/api/thr/index.md +++ b/docs/ref/api/thr/index.md @@ -6,3 +6,4 @@ are likely to be useful in callback functions and similar situations. - [nng_cv](nng_cv.md) --- condition variable - [nng_mtx](nng_mtx.md) --- mutual exclusion lock +- [nng_thread](nng_thread.md) -- thread of execution diff --git a/docs/ref/api/thr/nng_thread.md b/docs/ref/api/thr/nng_thread.md new file mode 100644 index 00000000..e13e77c6 --- /dev/null +++ b/docs/ref/api/thr/nng_thread.md @@ -0,0 +1,84 @@ +# nng_thread + +## NAME + +nng_thread --- thread of execution + +## SYNOPSIS + +```c +#include <nng/nng.h> + +typedef struct nng_thread nng_thread; + +int nng_thread_create(nng_thread **thrp, void (*func)(void *), void *arg); +void nng_thread_destroy(nng_thread *thr); +void nng_thread_set_name(nng_thread *thr, const char *name); +``` + +### DESCRIPTION + +The {{i:`nng_thread`}} structure is used to represent a {{i:thread}} of execution. + +In NNG, a thread has an execution fuction _func_, and can be assumed to run this concurrently +to other threads, including the main thread of the application. The thread persists +until the function _func_ returns. + +> [!TIP] +> The detail of whether the thread represents an operating system thread, +> a process, or a "green" thread (also known as a a fiber or coroutine) is determined by the platform. +> Portable applications should avoid depending on this implementation detail. + +The `nng_thread_create` function creates a thread, +running _func_ with the argument _arg_. +The thread is started immediately. +A pointer to the thread object is returned in _thrp_. + +Using threads created by this function can make it easy to write +programs that use simple sequential execution, using functions in the +_NNG_ suite that would otherwise normally wait synchronously for completion. + +When the thread is no longer needed, the {{i: `nng_thread_destroy`}} +function should be used to reap it. +(This function will block waiting for _func_ to return.) + +> [!IMPORTANT] +> Thread objects created by this function may not be real system-level +> threads capable of performing blocking I/O operations using normal blocking system calls. +> If use of blocking system calls is required (not including APIs provided +> by the _NNG_ library itself of course), then real OS-specific threads +> should be created instead (such as with `pthread_create` or similar functions.) + +> [!IMPORTANT] +> Thread objects created by this function cannot be passed to any system threading functions. + +> [!TIP] +> The system may impose limits on the number of threads that can be created. +> Typically applications should not create more than a dozen of these. +> If greater concurrency or scalability is needed, consider instead using +> an asynchronous model using [`nng_aio`][aio] structures. + +> [!TIP] +> Threads can be synchronized using [mutexes][mutex] and +> [condition variables][condvar]. + +In order to facilitate debugging, {{i:`nng_thread_set_name`}} may be called +to provide a name for the thread. This may change how the thread is represented +in debuggers. Not all platforms support setting the thread name. + +## RETURN VALUES + +The `nng_thread_create` function returns 0 on success, and non-zero otherwise. + +## ERRORS + +- `NNG_ENOMEM`: Insufficient free memory exists. + +## SEE ALSO + +[nng_cv][condvar], +[nng_mutex][mutex] + +[condvar]: ../thr/nng_cv.md +[mutex]: ../thr/nng_mtx.md +[aio]: TODO.md |
