Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::basic_..._osyncstream(3) C++ Standard Libarystd::basic_..._osyncstream(3)

NAME
       std::basic_osyncstream::basic_osyncstream - std::basic_osyncstream::ba-
       sic_osyncstream

Synopsis
	  basic_osyncstream(   streambuf_type*	buf,  const  Allocator&	 a  );
       (1)
	  explicit     basic_osyncstream(     streambuf_type*	   buf	    );
       (2)
	  basic_osyncstream(  std::basic_ostream<CharT,	Traits>& os, const Al-
       locator&	a ); (3)
	  explicit basic_osyncstream( std::basic_ostream<CharT,	Traits>& os );
       (4)
	  basic_osyncstream(  std::basic_osyncstream&&	 other	 )   noexcept;
       (5)

	  Constructs new synchronized output stream

	  1-4)	constructs  the	 private  member  std::basic_syncbuf using the
       buffer and the
	  allocator provided, and initializes the base class with a pointer to
       the member
	  std::basic_streambuf.
	  5) Move constructor. Move-constructs the std::basic_ostream base and
       the
	  std::basic_syncbuf  member  from  the	 corresponding	subobjects  of
       other, then calls
	  set_rdbuf  with  the	pointer	 to  the  newly-constructed underlying
       std::basic_syncbuf to
	  complete the initialization of the base. After this  move  construc-
       tor,
	  other.get_wrapped()  returns	nullptr	 and destruction of other pro-
       duces no	output.

Parameters
	  buf	- pointer to the std::basic_streambuf that will	be wrapped
	  os	- reference to a std::basic_ostream,  whose  rdbuf()  will  be
       wrapped
	  a	 -  the	 allocator  to	pass  to the constructor of the	member
       std::basic_syncbuf
	  other	- another osyncstream to move from

Example
       // Run this code

	#include <string_view>
	#include <syncstream>
	#include <iostream>
	#include <thread>

	void worker(const int id, std::ostream &os) {
	  std::string_view block;
	  switch (id) {
	    default: [[fallthrough]];
	    case 0: block = "";	break;
	    case 1: block = "";	break;
	    case 2: block = "";	break;
	    case 3: block = "";	break;
	  }
	  for(int i = 1; i <= 50; ++i) {
	    os << block	<< std::flush;
	  }
	  os <<	std::endl;
	}

	int main() {
	  std::cout << "Synchronized output should  not	 cause	any  interfer-
       ence:" << std::endl;
	  {
	    auto scout1	= std::osyncstream{std::cout};
	    auto scout2	= std::osyncstream{std::cout};
	    auto scout3	= std::osyncstream{std::cout};
	    auto scout4	= std::osyncstream{std::cout};
	    auto w1 = std::jthread{worker, 0, std::ref(scout1)};
	    auto w2 = std::jthread{worker, 1, std::ref(scout2)};
	    auto w3 = std::jthread{worker, 2, std::ref(scout3)};
	    auto w4 = std::jthread{worker, 3, std::ref(scout4)};
	  }

	  std::cout  <<	"\nLack	of synchronization may cause some interference
       on output:" << std::endl;
	  {
	    auto w1 = std::jthread{worker, 0, std::ref(std::cout)};
	    auto w2 = std::jthread{worker, 1, std::ref(std::cout)};
	    auto w3 = std::jthread{worker, 2, std::ref(std::cout)};
	    auto w4 = std::jthread{worker, 3, std::ref(std::cout)};
	  }
	}

Possible output:
	Synchronized output should not cause any interference:

	Lack of	synchronization	may cause some interference on output:

See also
	  constructor	constructs a basic_syncbuf object
			(public	    member	function      of      std::ba-
       sic_syncbuf<CharT,Traits,Allocator>)

http://cppreference.com		  2022.07.31	 std::basic_..._osyncstream(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::basic_osyncstream::basic_osyncstream&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help