From the blog

Reactor

Reactor Also known as Problem  Solution Structure Dynamic Behavior Example Pros and Cons Pros Cons What’s Next? Event-driven applications, such as GUIs or servers, often apply the architecture pattern Reactor. A Reactor can accept multiple requests simultaneously and distribute them to different handlers. The Reactor Pattern is an event-driven framework to concurrently demultiplex and dispatch service requests to various service providers. The requests are processed synchronously. Reactor Also known as Dispatcher Notifier Problem A server should answer several client requests simultaneously be performant, stable, and scalable be extendable to support new or improved services The application should be hidden from multi-threading and synchronization challenges  Solution Each supported service is encapsulated in a handler The handlers are registered within the Reactor The Reactor uses an event demultiplexer to wait synchronously on all incoming events When the Reactor is notified, it dispatches the service request to the specific handler Structure Handles The handles identify different event sources, such as network connections, open files, or GUI events. The event source generates events such as connect, read, or write queued on the associated handle. Synchronous event demultiplexer The synchronous event demultiplexer waits for one or more indication events and blocks until the associated handle can process the event. The system calls select, poll, epoll, kqueue, or WaitForMultipleObjects enable it to wait for indication events. Event handler The event handler defines the interface for processing the indication events. The event handler defines the supported services of the application. Concrete event handler The concrete event handler implements the interface of the application defined by the event handler. Reactor The Reactor supports an interface to register and deregister the concrete event handler using file descriptors. The Reactor uses a synchronous event demultiplexer to wait for indication events. An indication event can be a reading event, a writing event, or an error event. The Reactor maps the events to their concrete event handler. The Reactor manages the lifetime of the event loop. The Reactor (not the application) waits for the indication events to demultiplex and dispatch the event. The concrete event handlers are registered within the Reactor. The Reactor inverts the flow of control. This inversion of control is often called Hollywood principle. The dynamic behavior of a Reactor is pretty interesting. Dynamic Behavior The following points illustrate the control flow between the Reactor and the event handler. The application registers an event handler for specific events in the Reactor. Each event handler provides its specific handler to the Reactor. The application starts the event loop. The event loop waits for indication events. The event demultiplexer returns to the Reactor when an event source becomes ready. The Reactor dispatches the handles to the corresponding event handler. The event handler processes the event. Let’s study the Reactor in action. This example uses the POCO framework. “The POCO C++ Libraries are powerful cross-platform C++ libraries for building network- and internet-based applications that run on desktop, server, mobile, IoT, and embedded systems.” // reactor.cpp #include #include #include “Poco/Net/SocketReactor.h” #include “Poco/Net/SocketAcceptor.h” #include “Poco/Net/SocketNotification.h” #include “Poco/Net/StreamSocket.h” #include “Poco/Net/ServerSocket.h” #include “Poco/Observer.h” #include “Poco/Thread.h” #include “Poco/Util/ServerApplication.h” using Poco::Observer; using Poco::Thread; using Poco::Net::ReadableNotification; using Poco::Net::ServerSocket; using Poco::Net::ShutdownNotification; using Poco::Net::SocketAcceptor; using Poco::Net::SocketReactor; using Poco::Net::StreamSocket; using Poco::Util::Application; class EchoHandler { public: EchoHandler(const StreamSocket& s, SocketReactor& r): socket(s), reactor(r) { // (11) reactor.addEventHandler(socket, Observer<EchoHandler, ReadableNotification>(*this, &EchoHandler::socketReadable)); } void socketReadable(ReadableNotification*) […]

Read More

Concurrency Patterns

There are many well-established patterns used in the concurrency domain. They deal with synchronization challenges such as sharing and mutation but also with concurrent architectures. Today, I will introduce and dive deeper into them in additional posts. The main concern when you deal with concurrency is shared, mutable state or, as Tony Van Eerd put it in his CppCon 2014 talk “Lock-free by Example”: “Forget what you learned in Kindergarten (ie stop Sharing)”. A crucial term for concurrency is a data race. Let me first define this term. Data race: A data race is when at least two threads access a shared variable simultaneously. At least one thread tries to modify the variable. If your program has a data race, it has undefined behavior. This means all outcomes are possible, so reasoning about the program makes no sense anymore. A necessary condition for a data race is a mutable, shared state. If you handle sharing or mutation, no data race can happen. This is precisely the focus of the synchronization patterns. Classics such as Active and Monitor Object also address the concurrent architecture. Synchronization Patterns The focus of the synchronization patterns is to deal with sharing and mutation. Dealing with Sharing If you don’t share, no data races can happen. Not sharing means that your thread works on local variables. This can be achieved by a Copied Value, using Thread-Specific storage, or transferring the result of a thread to its associated Future via a protected data channel. Copied Value If a thread gets its arguments by copy and not by reference, there is no need to synchronize access to any data. No data races and no lifetime issues are possible. Thread-Specific Storage Thread-specific or thread-local storage allows multiple threads to use local storage via a global access point. By using the storage specifier thread_local, a variable becomes a thread-local variable. This means you can use the thread-local variable without synchronization. Futures C++11 provides futures and promises in three flavors: std::async, std::packaged_task, and the pair std::promise and std::future. The future is a read-only placeholder for the value that a promise sets. From the synchronization perspective, a promise/future pair’s critical property is that a protected data channel connects both. Dealing with Mutation No data race can happen if you don’t write and read data concurrently. First, protect the critical sections with a lock such as a Scoped or Strategized Locking. In object-oriented design, a critical section is typically an object, including its interface. The Thread-Safe Interface protects the entire object. The idea of the Guarded Suspension is to send a signal when it its done with its work. Scoped Locking Scoped locking is the idea of RAII applied to a mutex. The key idea of this idiom is to bind the resource acquisition and release to an object’s lifetime. As the name suggests, the lifetime of the object is scoped. Scoped means that the C++ run time is responsible for object destruction and, therefore, for releasing the resource. Strategized Locking Strategized locking is the idea of the strategy pattern applied to locking. This means putting your locking strategy into an object and making it into a pluggable component of your system. Thread-Safe Interface The Thread-Safe Interface fits very well when the critical sections are just objects. The naive idea to protect all […]

Read More

How To Run A C Or C++ Program On iOS

A fast and reliable C and C++ Compiler and IDE for app development software for iOS is very important for beginners and professionals alike, whether they are developing C++ for iOS or for any of the other operating systems and targets. The C and C++ programming languages are subjectively the World’s most powerful programming languages and consistently appear in the World’s top three most popular programming languages. Thanks to its huge range of ready-made variables, functions, methods, namespaces and libraries it’s the do-everything toolkit which can be used for everything from regular simple apps to low-level operating system drivers, IoT hardware control and everything in between. When a user wants to develop modern C++ applications, she or he will benefit from investing a very small amount of time in becoming familiar with the functions, features and shortcuts of a professional IDE. A small effort in that area pays dividends in productivity. In this post we explain basic of using C++ Builder to create an iOS app as a guide for beginners. What is a good IDE for creating a C++ program for iOS? Do you know that you can develop C/C++ iOS Apps on Windows 11 with the latest RAD Studio / C++ Builder? C++ Builder supports all C commands and CLANG LLVM, C++ 17 standards. RAD Studio with C++ Builder and Delphi is a great IDE and compiler running on Windows that supports multi-device applications for different platforms including iOS and you can develop native ARM applications for M1 Silicon CPUs used in the latest Apple hardware too. So, your application’s program code can be recompiled so that it runs on everything from the latest Windows 11 version as well as on Apple ‘desktop’ devices such as the MacBook laptops, Mac Minis and iMacs using either Intel processors or the new M1 ‘Silicon’ CPUs. Yet that same program code can almost entirely be reused with little or no changes so it may be compiled for iOS where your apps can run on the very latest iPhone devices. Everywhere your users are, your C++ and Delphi apps can be. In my opinion, because of its multi-device application and great tools of IDE, C++ Builder is the best C++ IDE Software and the best CLANG-based compiler that supports multi-device applications for all your needs including professional iOS application. How to create and run a C++ Program for iOS with the RAD Studio IDE and C++ Builder? C++ Builder is the easiest and fastest C and C++ IDE for building simple or professional applications on the Windows, macOS, and iOS operating systems. It is also easy for beginners to learn with its wide range of samples, tutorials, help files, and LSP support for code. C++ Builder comes with Rapid Application Development Studio, also known as RAD Studio. RAD Studio’s C++ Builder version comes with the award-winning VCL framework for high-performance native Windows apps and the powerful FireMonkey (FMX) framework for cross-platform UIs. There is a free C++ Builder Community Edition for students, beginners, and startups. More details about C++ Builder & RAD Studio for the beginners can be found in Official Wiki of Rad Studio. You can download the free C++ Builder Community Edition here: https://d-data.ro/product/c-builder-in-romania//starter.Professional developers can use the Professional, Architect or Enterprise versions of C++ Builder. Please visit https://d-data.ro/product/c-builder-in-romania/. See What’s New in RAD Studio 11 Download […]

Read More

What Is Defaulted Function or Method In Modern C++ Now?

Modern C++ is really amazing with a lot of great features of programming. One of the features of Modern C++ is a Defaulted Function or in another term Defaulted Method of classes that is a function that contains =default; in its prototype. Defaulted functions are a feature of C++11 and above. In this post, we explain what is a defaulted function or method in modern C++. What is defaulted function or method in Modern C++? A defaulted function (actually defaulted method, they are functions in classes) is a function that contains =default; in its prototype. This construction indicates that the function’s default definition should be used. Defaulted functions are a C++11 specific feature. If you have a method (including construction method) and you want to make it defaulted method, just add ‘=default;’ specifier to the end of this method declaration to declare that method as an explicitly defaulted method (or explicitly defaulted function). Is there a simple example of a defaulted function or method in modern C++? Here is an example to demonstrates defaulted function:  class Tmyclass {         Tmyclass() = default;                    // OK }; This will allow the compiler generate the default implementations for explicitly defaulted methods which are more efficient than manually programmed method implementations.  Here is another example class. class A {         A() = default;                    // OK         A& operator = (A & a) = default;  // OK         void f() = default;               // ill-formed, only special member function may default }; What is defaulted function or method in Modern C++? For example, if we have a parameterized constructor, we can use the ‘=default;’ specifier in order to create a default method. Because the compiler will not create a default constructor without this. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include   class Tmy_class { public:   Tmy_class(int x) // parameterized constructor { std::cout

Read More

How To Use C++ Standards In C++ Compiler Options

C++ is a very decent programming language that has a very strong compiler supported by a big community on a range of different platforms. The C++ language definitions, syntax, and functionality are organized into different standards. Those standards are usually named after the year the standard was adopted such as 1998 for C++98, 2011 for4 C++11, 2014 for C++14, and 2017 for C++17. One of the great features of a C++ compiler is you can choose which standards you want your code to be compiled against, before the compilation of your source code. This allows the compiler to check that your code complies with that standard. In this post, we explain what the standards are, how you can view them, how you can check the compatibility of your C++ source code against different standards, and how you can choose to use C++ standards in C++ compiler options. What is a C++ standard? Standards are an international agreement for C++ compilers, made by the IDE and compiler developers of different operating systems (Embarcadero C++ Builder, Microsoft MSVC, GNU GCC, Apple Swift, etc.). They are formal, legal, and very high-level detailed technical documents intended primarily for people writing C++ compilers and standard library implementations.  The current available standards and some of their key features are listed below. How to use C++ standards in C++ compiler options? When we use ‘-std=’ option in a C++ compiler this option type enables or disables some features. We need to use these features to see the effect of each C++ standard option. Personally, I always prefer to use the latest version of the standards in my compilers. However, when programming, sometimes you may have to work on old or legacy C++ source, or you may be programming to another company that uses older standard compilers. Or maybe you just want to check if your code is compatible with a particular standard, or the code uses new standards. At these times, you can use std option in C++ compilers. In general, we can use the -std option to compile to a particular C++ standard. Here are some option examples, -std=c++98 -std=c++11 -std=c++14 -std=c++17 -std=c++20 or -std=c++2a For example, if you want to compile your code with C++11 features, you can use C++ Builder 64bits command line compiler as shown below: bcc64 –std=c++11 myapp.cpp –o myapp For an example, we can write this C++ code below which uses a feature found in the C++17 standard and above. int main() {   static_assert(sizeof(int)==4); // C++17 feature     return 0; } If you are using the C++17 compiler, this code will be compiled successfully because the static_assert feature comes with C++17. If you compile this code with -std=c++11 or -std=c++14 options this time you will get warning which is telling you that you have requested C++ standard version 11, but there is a feature that requires C++ standard version 17 (Until C++17, a message was required w/ static_assert). How to use C++ standards in the C++ Builder compiler options? In C++ Builder CLANG compiler, we can use -std option to compile in previous standards. This option can be used in bcc32c and bcc64, both support these std options below, -std=c++11 -std=c++14 -std=c++17 I should note that, C++11 and C++14 options are partially supported, these options do not have a STL that works with all, so you have the latest STL one for C++17. According […]

Read More

Learn Unicode Character Types and Literals in Modern C++

C++11 brings a lot of improvements and I think one of the most important features were the Unicode Character Types and Literals that allow more support for strings in different languages globally. C++11 introduced a new character type to manipulate Unicode character strings. This can be used in C++11, C++14, C++17, and above. This feature improved interactions in next generation C++ applications, like chat, social media applications, and so on by allowing a more diverse set of language characters and symbols to be displayed as well as emoticons. In this post, we explain what are Unicode character types and literals in Modern C++. What are Unicode character types and literals in Modern C++ 11? Unicode character types and literals allow more support for different languages, characters, and symbols in strings. C++11 introduces new character types to manipulate Unicode character strings. These can be used in C++11, C++14, C++17, and above. This feature improved language support in editor and design applications (i.e. RAD Studio uses Unicode Strings). It also vastly improved interactions in the next generation C++ applications like chat and social media. This is why we can display smiley faces ????, Vulcan hand signals ???? and love hearts ????. C++ Builder implements new character types and character literals for Unicode. These types are among the C++11 features added to bcc32, bcc32c, and bcc64 compilers. 1. New character types C++11 introduces new character types to manipulate Unicode character strings. For more information on this feature, see Unicode Character Types and Literals (C++11). 2. Unicode string literals C++11 introduces new character types to manipulate Unicode string literals. For more information on this feature, see Unicode Character Types and Literals (C++11). 3. Raw string literals 4. Universal character names in literals In order to make the C++ code less platform-dependent, C++11 lifts the prohibitions regarding control and basic source universal character names within character and string literals. Prohibitions against surrogate values in all universal character names are added. For more information on this feature, see Universal character names in literals Proposal document. 5. User-defined literals C++11 introduces new forms of literals using modified syntax and semantics in order to provide user-defined literals. Using user-defined literals, user-defined classes can provide new literal syntax. For more information on this feature, see User-defined literals Proposal document. What are the Unicode character types char16_t and char32_t in Modern C++? With the C++11 standards, two new types were introduced to represent Unicode characters: char16_t is a 16-bit character type. char16_t is a C++ keyword. This type can be used for UTF-16 characters. char32_t is a 32-bit character type. char32_t is a C++ keyword. This type can be used for UTF-32 characters. The existing wchar_t type is a type for a wide character in the execution wide-character set. A wchar_t wide-character literal begins with an uppercase L (such as L’c’). We have a very good post that explains how you can use character literals in modern C++. What are the character literals u’character’ and U’character’ in Modern C++? There are two new ways to create character literals of the new types: u’character’ is a literal for a single char16_t character, such as u’g’. A multicharacter literal such as u’kh’ is badly formed. The value of a char16_t literal is equal to its ISO 10646 code point value, provided that the code point is representable as a 16-bit value. Only characters in the basic multilingual plane (BMP) can be represented. U’character’ is a literal for a single char32_t character, such as U’t’. A multicharacter literal such as U’de’ is ill-formed. […]

Read More

What Is The ‘>>’ Right-Angle Bracket Support In C++?

C++11 brings a lot of improvements over C++98. In C++98, two consecutive right-angle brackets (>>) give an error, and these constructions are treated according to the C++11 standard which means CLANG compilers no longer generate an error about right angle brackets. In this post, we explain this and how to solve the right-angle bracket problem in C++. What is the right-angle bracket problem in C++? Ever since the introduction of angle brackets in C++98, C++ developers have been surprised by the fact that two consecutive right-angle brackets must be separated by whitespace. For example, if you declare two-dimensional vector (int and bool) as below: #include   typedef std::vector vec1;  // OK   typedef std::vector vec2;  // Error In C++98, the first declaration is OK, but the second declaration give errors because of ‘>>‘ (right angle brackets). However, both are OK in C++11 and above. One of the problems was an immediate consequence of the “maximum munch” principle and the fact that >> is a valid token (right shift) in C++. In the CLANG-enhanced C++ compilers, two consecutive right-angle brackets no longer generate an error, and these constructions are treated according to the C++11 standard. This issue was a minor issue in C++98, but persisting, annoying, and somewhat embarrassing problem. The cost was reasonable, and it seems therefore worthwhile to eliminate the surprise. C++98 developers needed to add space between them. If you want to get more information, you can see details here. How can I solve the right-angle bracket problem in C++? If you have C++98 compiler and come across the right-angle bracket problem, you need to add space between two ‘>’ right angle brackets. ‘>>’ should be written as ‘> >’ as shown in the example below. #include   typedef std::vector vec2;  // OK   int main() { } Or you should change your C++ compiler so that it supports C++11 or above. C++17 is recommended. Note that the latest RAD Studio, C++ Builder standard and CLANG compilers supports C++17 features. What is the right-angle bracket support in C++ 11? In the Clang-enhanced C++ compilers, two consecutive right-angle brackets no longer generate an error, and these constructions are treated according to the C++11 standard.This example below with ‘>>’ right angle brackets can be successfully compiled with any compiler that supports C++11 and above. #include   typedef std::vector vec1;  // OK C++11 and above   int main() { } For more information, see the C++11 proposal document at Right Angle Brackets Proposal document

Read More

Create C++ Member Function in Visual Studio

We are excited to announce that Create C++ Member Function can now be used to quickly add constructor and in Visual Studio 17.6 Preview 2. When you have a class with fields, you can add a default constructor, constructor with all fields, equality operator, and . Three dots will appear below a class name to indicate that you can add a member function, and you can hover over them to see the quick action (screwdriver icon). When the default constructor and equality operator are added respectively, the Go to Definition of the operator== is displayed below, showing that the body of the   You can also choose to add a constructor with all fields and an equality operator with all fields respectively, and the Go to Definition will show that the operator== has all the field comparisons.     Future Work This experimental feature will be improved by adding more functions that can save you a lot of typing. Right now, it includes constructor and operator==and we are considering adding more cases,   We have a Developer Community ticket to Improve “Create Member Function”, if you have the same suggestions make sure to upvote it.   Send us your feedback!  Download the latest version of Visual Studio Preview and give the Create C++ Member Function feature a try. Your feedback will be extremely helpful in shaping this experience, therefore, please continue to send your feedback in the comments below or/and via Developer Community. You can also reach us on Twitter (@VisualC), or via email at visualcpp@microsoft.com.   

Read More

Maximize Unreal Engine Development with the Latest Integrations in Visual Studio 2022

Since our announcement last month, the team has been working hard on building a new round of Unreal Engine integrations. Today, we are happy to show you the next set of features that can level up your game development productivity. In this article, you will learn about how to stream Unreal Logs, see Unreal Header Tool warnings in Visual Studio, and discover how you can be more productive working with HLSL files. All features mentioned below are available in the latest Visual Studio 2022 Preview. Curious to see these features in action? I chatted with Leslie Richardson in a special edition of Visual Studio Toolbox to demo many of the recently available game dev features in Visual Studio. Setting Up Unreal Engine Integrations Unreal Engine integrations will only show up when you are working on an Unreal Engine project. To ensure these features are active, double check that “IDE support for Unreal Engine” component is enabled in the “Game development for C++” workload in the VS Installer. Stream Unreal Engine Log We spoke with Unreal Engine developers and discovered the frustration of having to switch between tasks. Furthermore, this was particularly painful when they need to frequently switch between the UE editor and Visual Studio. As part of the continued efforts to reduce this pain, we are happy to introduce the ability to see your Unreal Engine logs without leaving Visual Studio. Upon pressing F5, Visual Studio will stream Unreal Engine logs to the UE Log window. To see the logs from the Unreal Engine Editor, click View -> Other Windows -> UE Log. When the Visual Studio Debugger is attached to your game, logs are streamed automatically. Alternatively, you can enable cross-process capturing by pressing the “Record” button. As a result, you can stream logs even when the debugger is not attached. To filter your logs, click on the “Categories” or “Verbosity” dropdowns This feature is currently an experimental feature, we would greatly appreciate feedback from you. Leave your thoughts by commenting on Unreal Engine Log Feedback. Code Analysis for Unreal Engine Code Analysis is an important part of the software development workflow. By creating opportunities to identify potential errors prior to compilation, you can save valuable time in your developer inner-loop. Today, we are adding the first of many Unreal Engine specific Code Analysis checks designed to make you more productive. In Visual Studio, you can now see warnings and errors generated by the Unreal Header Tool. Upon saving a file, Visual Studio will run the Unreal Header Tool in the background. Next, Visual Studio will display any warnings or errors in the Error List or as a purple squiggle in the editor. For additional information, please visit the documentation page for Unreal Header Tool. This feature is off-by-default. To enable the feature, please go to “Tools -> Options -> Environment -> Preview Features” and check the box by “Code Analysis with Unreal Header Tool (C++)”. We look forward to hearing from you about UE Code Analysis. Please leave feedback by commenting in the UE Code Analysis Feedback Ticket. Stay tuned for more Code Analysis checks in the upcoming previews. Creating shaders in game development is an important workflow for game developers. We worked with Tim Jones, the author of the popular HLSL Tools extension, to bring syntax […]

Read More

C++23’s New Fold Algorithms

C++20 added new versions of the standard library algorithms which take ranges as their first argument rather than iterator pairs, alongside other improvements. However, key algorithms like std::accumulate were not updated. This has been done in C++23, with the new std::ranges::fold_* family of algorithms. The standards paper for this is P2322 and was written by Barry Revzin. It been implemented in Visual Studio 2022 version 17.5. In this post I’ll explain the benefits of the new “rangified” algorithms, talk you through the new C++23 additions, and explore some of the design space for fold algorithms in C++. Background: Rangified Algorithms C++20’s algorithms make several improvements to the old iterator-based ones. The most obvious is that they now can take a range instead of requiring you to pass iterator pairs. But they also allow passing a “projection function” to be called on elements of the range before being processed, and the use of C++20 concepts for constraining their interfaces more strictly defines what valid uses of these algorithms are. These changes allow you to make refactors like: // C++17 algorithm cat find_kitten(const std::vector& cats) { return *std::find_if(cats.begin(), cats.end(), [](cat const& c) { return c.age == 0; }); } // C++20 algorithm cat find_kitten(std::span cats) { return *std::ranges::find(cats, 0, &cat::age); } The differences here are: Instead of having to pass cats.begin() and cats.end(), we just pass cats itself. Since we are comparing a member variable of the cat to 0, in C++17 we need to use std::find_if and pass a closure which accesses that member and does the comparison. Since the rangified algorithms support projections, in C++20 we can use std::ranges::find and pass &cat::age as a projection, getting rid of the need for the lambda completely. These improvements can greatly clean up code which makes heavy use of the standard library algorithms. Unfortunately, alongside the algorithms which reside in the header, there are also several important ones in the header, and these were not rangified in C++201. In this post we’re particularly interested in std::accumulate and std::reduce. accumulate and reduce std::accumulate and std::reduce are both fold operations. They “fold” or “reduce” or “combine” multiple values into a single value. Both take two iterators, an initial value, and a binary operator (which defaults to +). They then run the given operator over the range of values given by the iterators, collecting a result as they go. For instance, given std::array arr = {1,2,3}, std::accumulate(begin(arr), end(arr), 0, std::plus()) will run (((0 + 1) + 2) + 3). Or std::accumulate(begin(arr), end(arr), 0, f) will run f(f(f(0, 1), 2), 3). These functions are both what are called left folds because they run from left to right. There’s also right folds, which as you may guess, run from right to left. For the last example a right fold would look like f(1, f(2, f(3, 0))). For some operations, like +, these would give the same result, but for operations which are not associative (like -), it could make a difference. So why do we have both std::accumulate and std::reduce? std::reduce was added in C++17 as one of the many parallel algorithms which let you take advantage of parallel execution for improved performance. The reason it has a different name than std::accumulate is because it has different constraints on what types and operations you can use: namely the […]

Read More