Difference between revisions of "Device (C++)"

From Neurotech Software Development Kit
Jump to: navigation, search
Line 1: Line 1:
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">Neuro::</span>Device</h1>
+
=<span style="font-size:0.7em; line-height:130%">Neuro::</span>Device=
 
<div id="bodyContent">
 
<div id="bodyContent">
 
                                         <!-- tagline -->
 
                                         <!-- tagline -->

Revision as of 07:38, 25 April 2018

Neuro::Device

From cppreference.com
< <a href="/w/cpp" title="cpp">cpp</a>‎ | <a href="/w/cpp/thread" title="cpp/thread">thread</a>
 
<a href="/w/cpp" title="cpp"> C++</a>
<tbody> </tbody>
<a href="/w/cpp/language" title="cpp/language"> Language</a>
<a href="/w/cpp/header" title="cpp/header"> Headers</a>
<a href="/w/cpp/concept" title="cpp/concept"> Library concepts</a>
<a href="/w/cpp/utility#Language_support" title="cpp/utility"> Language support library</a>
<a href="/w/cpp/error" title="cpp/error"> Diagnostics library</a>
<a href="/w/cpp/utility" title="cpp/utility"> Utilities library</a>
<a href="/w/cpp/string" title="cpp/string"> Strings library</a>
<a href="/w/cpp/container" title="cpp/container"> Containers library</a>
<a href="/w/cpp/algorithm" title="cpp/algorithm"> Algorithms library</a>
<a href="/w/cpp/iterator" title="cpp/iterator"> Iterators library</a>
<a href="/w/cpp/numeric" title="cpp/numeric"> Numerics library</a>
<a href="/w/cpp/io" title="cpp/io"> Input/output library</a>
<a href="/w/cpp/locale" title="cpp/locale"> Localizations library</a>
<a href="/w/cpp/regex" title="cpp/regex"> Regular expressions library</a> (C++11)
<a href="/w/cpp/atomic" title="cpp/atomic"> Atomic operations library</a> (C++11)
<a href="/w/cpp/thread" title="cpp/thread"> Thread support library</a> (C++11)
<a href="/w/cpp/filesystem" title="cpp/filesystem"> Filesystem library</a> (C++17)
<a href="/w/cpp/experimental" title="cpp/experimental"> Technical Specifications</a>
 
<a href="/w/cpp/thread" title="cpp/thread"> Thread support library</a>
<tbody> </tbody>
Threads
<a href="/w/cpp/thread/thread" title="cpp/thread/thread">thread</a>
(C++11)
<a href="/w/cpp/thread/hardware_destructive_interference_size" title="cpp/thread/hardware destructive interference size">hardware_destructive_interference_sizehardware_constructive_interference_size</a>
(C++17)(C++17)
this_thread namespace
<tbody> </tbody>
<a href="/w/cpp/thread/get_id" title="cpp/thread/get id">get_id</a>
(C++11)
<a href="/w/cpp/thread/yield" title="cpp/thread/yield">yield</a>
(C++11)
<tbody> </tbody>
<a href="/w/cpp/thread/sleep_for" title="cpp/thread/sleep for">sleep_for</a>
(C++11)
<a href="/w/cpp/thread/sleep_until" title="cpp/thread/sleep until">sleep_until</a>
(C++11)
Mutual exclusion
<tbody> </tbody>
mutex
(C++11)
<a href="/w/cpp/thread/recursive_mutex" title="cpp/thread/recursive mutex">recursive_mutex</a>
(C++11)
<a href="/w/cpp/thread/shared_mutex" title="cpp/thread/shared mutex">shared_mutex</a>
(C++17)
<tbody> </tbody>
<a href="/w/cpp/thread/timed_mutex" title="cpp/thread/timed mutex">timed_mutex</a>
(C++11)
<a href="/w/cpp/thread/recursive_timed_mutex" title="cpp/thread/recursive timed mutex">recursive_timed_mutex</a>
(C++11)
<a href="/w/cpp/thread/shared_timed_mutex" title="cpp/thread/shared timed mutex">shared_timed_mutex</a>
(C++14)
Generic lock management
<tbody> </tbody>
<a href="/w/cpp/thread/lock_guard" title="cpp/thread/lock guard">lock_guard</a>
(C++11)
<a href="/w/cpp/thread/scoped_lock" title="cpp/thread/scoped lock">scoped_lock</a>
(C++17)
<a href="/w/cpp/thread/unique_lock" title="cpp/thread/unique lock">unique_lock</a>
(C++11)
<a href="/w/cpp/thread/shared_lock" title="cpp/thread/shared lock">shared_lock</a>
(C++14)
<a href="/w/cpp/thread/lock_tag_t" title="cpp/thread/lock tag t">defer_lock_ttry_to_lock_tadopt_lock_t</a>
(C++11)(C++11)(C++11)
<tbody> </tbody>
<a href="/w/cpp/thread/lock" title="cpp/thread/lock">lock</a>
(C++11)
<a href="/w/cpp/thread/try_lock" title="cpp/thread/try lock">try_lock</a>
(C++11)
<a href="/w/cpp/thread/lock_tag" title="cpp/thread/lock tag">defer_locktry_to_lockadopt_lock</a>
(C++11)(C++11)(C++11)
<a href="/w/cpp/thread/once_flag" title="cpp/thread/once flag">once_flag</a>
(C++11)
<a href="/w/cpp/thread/call_once" title="cpp/thread/call once">call_once</a>
(C++11)
Condition variables
<a href="/w/cpp/thread/condition_variable" title="cpp/thread/condition variable">condition_variable</a>
(C++11)
<a href="/w/cpp/thread/condition_variable_any" title="cpp/thread/condition variable any">condition_variable_any</a>
(C++11)
<a href="/w/cpp/thread/notify_all_at_thread_exit" title="cpp/thread/notify all at thread exit">notify_all_at_thread_exit</a>
(C++11)
<a href="/w/cpp/thread/cv_status" title="cpp/thread/cv status">cv_status</a>
(C++11)
Futures
<tbody> </tbody>
<a href="/w/cpp/thread/promise" title="cpp/thread/promise">promise</a>
(C++11)
<a href="/w/cpp/thread/future" title="cpp/thread/future">future</a>
(C++11)
<a href="/w/cpp/thread/shared_future" title="cpp/thread/shared future">shared_future</a>
(C++11)
<a href="/w/cpp/thread/packaged_task" title="cpp/thread/packaged task">packaged_task</a>
(C++11)
<a href="/w/cpp/thread/async" title="cpp/thread/async">async</a>
(C++11)
<tbody> </tbody>
<a href="/w/cpp/thread/launch" title="cpp/thread/launch">launch</a>
(C++11)
<a href="/w/cpp/thread/future_status" title="cpp/thread/future status">future_status</a>
(C++11)
<a href="/w/cpp/thread/future_error" title="cpp/thread/future error">future_error</a>
(C++11)
<a href="/w/cpp/thread/future_category" title="cpp/thread/future category">future_category</a>
(C++11)
<a href="/w/cpp/thread/future_errc" title="cpp/thread/future errc">future_errc</a>
(C++11)
 
std::mutex
<tbody> </tbody>
Member functions
<a href="/w/cpp/thread/mutex/mutex" title="cpp/thread/mutex/mutex">mutex::mutex</a>
<a href="/w/cpp/thread/mutex/%7Emutex" title="cpp/thread/mutex/~mutex">mutex::~mutex</a>
Locking
<a href="/w/cpp/thread/mutex/lock" title="cpp/thread/mutex/lock">mutex::lock</a>
<a href="/w/cpp/thread/mutex/try_lock" title="cpp/thread/mutex/try lock">mutex::try_lock</a>
<a href="/w/cpp/thread/mutex/unlock" title="cpp/thread/mutex/unlock">mutex::unlock</a>
Native handle
<a href="/w/cpp/thread/mutex/native_handle" title="cpp/thread/mutex/native handle">mutex::native_handle</a>
 
<tbody> </tbody>
Defined in header <a href="/w/cpp/header/mutex" title="cpp/header/mutex"><mutex></a>
class mutex;
(since C++11)

The mutex class is a synchronization primitive that can be used to protect shared data from being simultaneously accessed by multiple threads.

mutex offers exclusive, non-recursive ownership semantics:

  • A calling thread owns a mutex from the time that it successfully calls either <a href="/w/cpp/thread/mutex/lock" title="cpp/thread/mutex/lock">lock</a> or <a href="/w/cpp/thread/mutex/try_lock" title="cpp/thread/mutex/try lock">try_lock</a> until it calls <a href="/w/cpp/thread/mutex/unlock" title="cpp/thread/mutex/unlock">unlock</a>.
  • When a thread owns a mutex, all other threads will block (for calls to <a href="/w/cpp/thread/mutex/lock" title="cpp/thread/mutex/lock">lock</a>) or receive a false return value (for <a href="/w/cpp/thread/mutex/try_lock" title="cpp/thread/mutex/try lock">try_lock</a>) if they attempt to claim ownership of the mutex.
  • A calling thread must not own the mutex prior to calling <a href="/w/cpp/thread/mutex/lock" title="cpp/thread/mutex/lock">lock</a> or <a href="/w/cpp/thread/mutex/try_lock" title="cpp/thread/mutex/try lock">try_lock</a>.

The behavior of a program is undefined if a mutex is destroyed while still owned by any threads, or a thread terminates while owning a mutex. The mutex class satisfies all requirements of <a href="/w/cpp/concept/Mutex" title="cpp/concept/Mutex">Mutex</a> and <a href="/w/cpp/concept/StandardLayoutType" title="cpp/concept/StandardLayoutType">StandardLayoutType</a>.

std::mutex is neither copyable nor movable.

<tbody></tbody>

Contents

 [<a href="#" class="internal" id="togglelink">hide</a>] 
  • <a href="#Member_types">1 Member types</a>
  • <a href="#Member_functions">2 Member functions</a>
    • <a href="#Locking">2.1 Locking</a>
    • <a href="#Native_handle">2.2 Native handle</a>
  • <a href="#Notes">3 Notes</a>
  • <a href="#Example">4 Example</a>

[<a href="/mwiki/index.php?title=cpp/thread/mutex&action=edit&section=1" title="Edit section: Member types">edit</a>] Member types

<tbody> </tbody>
Member type Definition
native_handle_type(optional) implementation-defined

[<a href="/mwiki/index.php?title=cpp/thread/mutex&action=edit&section=2" title="Edit section: Member functions">edit</a>] Member functions

<tbody> </tbody>
<a href="/w/cpp/thread/mutex/mutex" title="cpp/thread/mutex/mutex"> (constructor)</a>
constructs the mutex
(public member function) <a rel="nofollow" class="external text" href="http://en.cppreference.com/mwiki/index.php?title=Template:cpp/thread/mutex/dsc_constructor&action=edit">[edit]</a>
<a href="/w/cpp/thread/mutex/%7Emutex" title="cpp/thread/mutex/~mutex"> (destructor)</a>
destroys the mutex
(public member function) <a rel="nofollow" class="external text" href="http://en.cppreference.com/mwiki/index.php?title=Template:cpp/thread/mutex/dsc_destructor&action=edit">[edit]</a>
operator=
[deleted]
not copy-assignable
(public member function) <a rel="nofollow" class="external text" href="http://en.cppreference.com/mwiki/index.php?title=Template:cpp/thread/mutex/dsc_operator%3D&action=edit">[edit]</a>
Locking
<a href="/w/cpp/thread/mutex/lock" title="cpp/thread/mutex/lock"> lock</a>
locks the mutex, blocks if the mutex is not available
(public member function) <a rel="nofollow" class="external text" href="http://en.cppreference.com/mwiki/index.php?title=Template:cpp/thread/mutex/dsc_lock&action=edit">[edit]</a>
<a href="/w/cpp/thread/mutex/try_lock" title="cpp/thread/mutex/try lock"> try_lock</a>
tries to lock the mutex, returns if the mutex is not available
(public member function) <a rel="nofollow" class="external text" href="http://en.cppreference.com/mwiki/index.php?title=Template:cpp/thread/mutex/dsc_try_lock&action=edit">[edit]</a>
<a href="/w/cpp/thread/mutex/unlock" title="cpp/thread/mutex/unlock"> unlock</a>
unlocks the mutex
(public member function) <a rel="nofollow" class="external text" href="http://en.cppreference.com/mwiki/index.php?title=Template:cpp/thread/mutex/dsc_unlock&action=edit">[edit]</a>
Native handle
<a href="/w/cpp/thread/mutex/native_handle" title="cpp/thread/mutex/native handle"> native_handle</a>
returns the underlying implementation-defined native handle object
(public member function) <a rel="nofollow" class="external text" href="http://en.cppreference.com/mwiki/index.php?title=Template:cpp/thread/mutex/dsc_native_handle&action=edit">[edit]</a>

[<a href="/mwiki/index.php?title=cpp/thread/mutex&action=edit&section=3" title="Edit section: Notes">edit</a>] Notes

std::mutex is usually not accessed directly: <a href="/w/cpp/thread/unique_lock" title="cpp/thread/unique lock">std::unique_lock</a>, <a href="/w/cpp/thread/lock_guard" title="cpp/thread/lock guard">std::lock_guard</a>, or std::scoped_lock (since C++17) manage locking in a more exception-safe manner.

[<a href="/mwiki/index.php?title=cpp/thread/mutex&action=edit&section=4" title="Edit section: Example">edit</a>] Example

This example shows how a mutex can be used to protect a <a href="/w/cpp/container/map" title="cpp/container/map">std::map</a> shared between two threads.

<span class="co2">#include <iostream></span>
<span class="co2">#include <map></span>
<span class="co2">#include <string></span>
<span class="co2">#include <chrono></span>
<span class="co2">#include <thread></span>
<span class="co2">#include <mutex></span>
 
<a href="http://en.cppreference.com/w/cpp/container/map"><span class="kw1281">std::<span class="me2">map</span></span></a><span class="sy1"><</span><a href="http://en.cppreference.com/w/cpp/string/basic_string"><span class="kw1230">std::<span class="me2">string</span></span></a>, <a href="http://en.cppreference.com/w/cpp/string/basic_string"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="sy1">></span> g_pages<span class="sy4">;</span>
std<span class="sy4">::</span><span class="me2">mutex</span> g_pages_mutex<span class="sy4">;</span>
 
<span class="kw4">void</span> save_page<span class="br0">(</span><span class="kw4">const</span> <a href="http://en.cppreference.com/w/cpp/string/basic_string"><span class="kw1230">std::<span class="me2">string</span></span></a> <span class="sy3">&</span>url<span class="br0">)</span>
<span class="br0">{</span>
    <span class="co1">// simulate a long page fetch</span>
    <a href="http://en.cppreference.com/w/cpp/thread/sleep_for"><span class="kw2149">std::<span class="me2">this_thread</span><span class="sy4">::</span><span class="me2">sleep_for</span></span></a><span class="br0">(</span><a href="http://en.cppreference.com/w/cpp/chrono/duration"><span class="kw997">std::<span class="me2">chrono</span><span class="sy4">::</span><span class="me2">seconds</span></span></a><span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
    <a href="http://en.cppreference.com/w/cpp/string/basic_string"><span class="kw1230">std::<span class="me2">string</span></span></a> result <span class="sy1">=</span> <span class="st0">"fake content"</span><span class="sy4">;</span>
 
    <a href="http://en.cppreference.com/w/cpp/thread/lock_guard"><span class="kw2165">std::<span class="me2">lock_guard</span></span></a><span class="sy1"><</span>std<span class="sy4">::</span><span class="me2">mutex</span><span class="sy1">></span> guard<span class="br0">(</span>g_pages_mutex<span class="br0">)</span><span class="sy4">;</span>
    g_pages<span class="br0">[</span>url<span class="br0">]</span> <span class="sy1">=</span> result<span class="sy4">;</span>
<span class="br0">}</span>
 
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> 
<span class="br0">{</span>
    <a href="http://en.cppreference.com/w/cpp/thread/thread"><span class="kw2146">std::<span class="me2">thread</span></span></a> t1<span class="br0">(</span>save_page, <span class="st0">"http://foo"</span><span class="br0">)</span><span class="sy4">;</span>
    <a href="http://en.cppreference.com/w/cpp/thread/thread"><span class="kw2146">std::<span class="me2">thread</span></span></a> t2<span class="br0">(</span>save_page, <span class="st0">"http://bar"</span><span class="br0">)</span><span class="sy4">;</span>
    t1.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
    t2.<span class="me1">join</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
 
    <span class="co1">// safe to access g_pages without lock now, as the threads are joined</span>
    <span class="kw1">for</span> <span class="br0">(</span><span class="kw4">const</span> <span class="kw4">auto</span> <span class="sy3">&</span>pair <span class="sy4">:</span> g_pages<span class="br0">)</span> <span class="br0">{</span>
        <a href="http://en.cppreference.com/w/cpp/io/cout"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> pair.<span class="me1">first</span> <span class="sy1"><<</span> <span class="st0">" => "</span> <span class="sy1"><<</span> pair.<span class="me1">second</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
    <span class="br0">}</span>
<span class="br0">}</span>

Output:

http://bar => fake content
http://foo => fake content