File: sync_tutorial.qbk

package info (click to toggle)
boost1.83 1.83.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 545,632 kB
  • sloc: cpp: 3,857,086; xml: 125,552; ansic: 34,414; python: 25,887; asm: 5,276; sh: 4,799; ada: 1,681; makefile: 1,629; perl: 1,212; pascal: 1,139; sql: 810; yacc: 478; ruby: 102; lisp: 24; csh: 6
file content (66 lines) | stat: -rw-r--r-- 1,805 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
[/
  (C) Copyright 2012 Vicente J. Botet Escriba.
  Distributed under the Boost Software License, Version 1.0.
  (See accompanying file LICENSE_1_0.txt or copy at
  http://www.boost.org/LICENSE_1_0.txt).
]

[section:tutorial Tutorial]


[@http://web.archive.org/web/20140531071228/http://home.roadrunner.com/~hinnant/mutexes/locking.html Handling mutexes in C++] is an excellent tutorial. You need just replace std and ting by boost.


[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html Mutex, Lock, Condition Variable Rationale] adds rationale for the design decisions made for mutexes, locks and condition variables.


In addition to the C++11 standard locks, Boost.Thread provides other locks and some utilities that help the user to make their code thread-safe.

[include internal_locking.qbk]

[include external_locking.qbk]

[section:with Executing Around a Function]

In particular, the library provides a way to lock around the execution of a function.

  template <class Lockable, class Function, class... Args>
  auto with_lock_guard(
      Lockable& m,
      Function&& func,
      Args&&... args
  ) -> decltype(func(boost::forward<Args>(args)...)) {
    boost::lock_guard<Lockable> lock(m);
    return func(boost::forward<Args>(args)...);
  }

that can be used with regular functions:

  int func(int, int&);
  //...
  boost::mutex m;
  int a;
  int result = boost::with_lock_guard(m, func, 1, boost::ref(a));

with boost::bind:

  int result = boost::with_lock_guard(
      m, boost::bind(func, 2, boost::ref(a))
  );

or with lambda expression:

  int a;
  int result = boost::with_lock_guard(
      m,
      [&a](int x) {
        // this scope is protected by mutex m
        a = 3;
        return x + 4;
      },
      5
  );

[endsect] [/ With]

[endsect] [/ Tutorial]