C++ barrier::arrive_and_drop() Function



The std::barrier::arrive_and_drop() function in C++, is designed to synchronize with the multiple threads. When this function is invoked, it signals that it has reached a specific synchronization point simultaneously drop out of the further synchronization cycles.

This function is particularly useful when a thread needs to synchronize only once or a limited number of times to a task, allowing it to exit without affecting the ongoing barrier synchronization.

Syntax

Following is the syntax for std::barrier::arrive_and_drop() function.

void arrive_and_drop();

Parameters

It does not accepts any parameter.

Return value

This function does not returns anything.

Exception

It throws std::system_error with an error code allowed for mutex types on error.

Example 1

In the following example, we are going to consider the basic usage of the arrive_and_drop() function.

#include <iostream>
#include <barrier>
#include <thread>
std::barrier sync_point(2);
void a(int b) {
   std::cout << "Thread " << b << " Working.\n";
   sync_point.arrive_and_drop();
   std::cout << "Thread " << b << " Finished.\n";
}
int main() {
   std::thread x1(a, 1);
   std::thread x2(a, 2);
   x1.join();
   x2.join();
   return 0;
}

Output

Output of the above code is as follows −

Thread 1 Working.
Thread 1 Finished.
Thread 2 Working.
Thread 2 Finished.

Example 2

Consider the following example, we are going to dynamically drop the thread based on a condition.

#include <iostream>
#include <thread>
#include <barrier>
void a(std::barrier < > & b, int c) {
   std::cout << "Thread " << c << " Working\n";
   if (c % 2 == 0) {
      b.arrive_and_drop();
      std::cout << "Thread " << c << " Is Leaving.\n";
   } else {
      b.arrive_and_wait();
      std::cout << "Thread " << c << " Synchronized.\n";
   }
}
int main() {
   std::barrier b(3);
   std::thread x1(a, std::ref(b), 1);
   std::thread x2(a, std::ref(b), 2);
   std::thread x3(a, std::ref(b), 3);
   x1.join();
   x2.join();
   x3.join();
   return 0;
}

Output

Following is the output of the above code −

Thread 2 Working
Thread 2 Is Leaving.
Thread 1 Working
Thread 3 Working
Thread 3 Synchronized.
Thread 1 Synchronized.
cpp_barrier.htm
Advertisements