Assuming X and Y are suitable types for such usage, is it UB to use std::start_lifetime_as<X> on an area of memory in one thread as one type and use std::start_lifetime_as<Y> on the exact same memory in another thread? Does the standard say anything about this? If it doesn't, what is the correct interpretation?
std::start_lifetime_as and UB in C++23 multithreaded application
526 Views Asked by markt1964 At
2
There are 2 best solutions below
2
Davis Herring
On
There is no data race from such calls, since none of them access any memory locations, but since (without synchronization) neither thread can know that the other has not ended the lifetime of its desired object by reusing its storage for an object of the other type, the objects created cannot be used. (There are not “even odds” that one thread can use them because it “went last”: there is an execution where it didn’t, so relying on that would have undefined behavior.)
Related Questions in C++
- How to immediately apply DISPLAYCONFIG_SCALING display scaling mode with SetDisplayConfig and DISPLAYCONFIG_PATH_TARGET_INFO
- Why can't I use templates members in its specialization?
- How to fix "Access violation executing location" when using GLFW and GLAD
- Dynamic array of structures in C++/ cannot fill a dynamic array of doubles in structure from dynamic array of structures
- How do I apply the interface concept with the base-class in design?
- File refuses to compile std::erase() even if using -std=g++23
- How can I do a successful map when the number of elements to be mapped is not consistent in Thrust C++
- Can std::bit_cast be applied to an empty object?
- Unexpected inter-thread happens-before relationships from relaxed memory ordering
- How i can move element of dynamic vector in argument of function push_back for dynamic vector
- Brick Breaker Ball Bounce
- Thread-safe lock-free min where both operands can change c++
- Watchdog Timer Reset on ESP32 using Webservers
- How to solve compiler error: no matching function for call to 'dmhFS::dmhFS()' in my case?
- Conda CMAKE CXX Compiler error while compiling Pytorch
Related Questions in LANGUAGE-LAWYER
- Can std::bit_cast be applied to an empty object?
- Static data member of template class type: constexpr vs. const constinit
- What was the problem with std::is_callable?
- Clang fails with "function with deduced return type cannot be used before it is defined", while GCC works
- Can a tentative definition use the storage class specifier _Thread_local?
- operator delete after both operator new and placement new?
- Is casting "pointer to array of type" to "pointer to type" defined?
- Are there uses of std::forward, where the argument is not a variable name?
- Why does C++ allow making a reference to a variable that goes out of scope?
- Deadlock on static-initialized jthread calling std::stacktrace_entry::description
- Is it legal to zero empty C++ classes in the constructor and inherit from them?
- Are there any specific types or values for which type-punning produces identical behavior in all Standard-conforming C implementations?
- Function pointer compatibility between single pointer and empty parameter lists
- In C++ can you use one empty type as storage for another?
- When is it safe to use [[no_unique_address]] in C++?
Related Questions in UNDEFINED-BEHAVIOR
- Is it allowed to pass "this" of derived class to constructor of base class?
- Incorrect implementation of calloc() introduces division by zero and how to detect it via testing?
- What is erroneous behavior? How is it different from undefined behavior?
- Initialize a structure pointer to NULL, then try to change its members
- PhpStorm doesn't detect undefined variables at all
- Function is returning null instead of array in C
- Is this use of va_copy undefined behaviour?
- Putting 'noexcept' on possible UB
- Returning a struct containing array in C
- What should happen when control reaches __builtin_unreachable?
- Custom macro logic
- Type incoherence when compiling Java code through GWT
- Issue with printing the correct size of a string in C
- Can max_size() be undefined behavior?
- Does the runtime dereference of a nullptr always result in Segmentation Fault?
Related Questions in OBJECT-LIFETIME
- Does lifetime extension also construct an object on the stack?
- decltype(auto) return type and lifetime issues
- std::start_lifetime_as and UB in C++23 multithreaded application
- Object Lifetime and undefined behavior
- Can a pointer to a memory be used as initialized trivial type?
- Object Lifetime and cudaMemcpy
- Pushed Authorization Request lifetime in OpenID Connect
- Object life Time and encapsulation in C++
- What does "Lifetime of Object" actually mean?
- Classes with runtime parameters built by custom factories: how to honor container lifetime using .NET Core DI?
- Make rvalues persist as pointers in a recursive class
- Is my third party service instance which is wrapped inside another service being disposed in case of a transient lifetime registration in .NET 6?
- Is it possible to avoid copying a temporary class instance passed to a function that saves a pointer to it?
- Pointer to temporary object
- How to solve "Returns a value referencing data owned by the current function" (Actual depenecies between structs)
Related Questions in C++23
- Static data member of template class type: constexpr vs. const constinit
- Clang fails with "function with deduced return type cannot be used before it is defined", while GCC works
- Allow std::expected to use a private constructor
- Why does std::views::take not yield a sized_range?
- new initializer expression list treated as compound expression [-fpermissive]
- converting utf8 to utf32
- Eclipse can not seem to understand newer features of C++
- C++ concept to match an alternative of a std::variant (but that also works with types inherited from std::variant)
- deducing this and std::bind
- How to to concat multiple ranges views
- get the indices in a C++ mdspan from a reference by arithmetic
- How can I write a beautiful inline recursive lambda in C++?
- What exactly is the difference between std::forward and std::forward_like?
- I am unable to construct a vector using a iterators over a view that uses take_while in its construction
- Making a custom type behave like std::string
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular # Hahtags
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Object lifetime is actually one of the more underspecified parts of the standard, especially when it comes to concurrency (and in some places the wording is outright defective IMO), but I think this specific question is answerable with what's there.
First, let's get data races out of the way.
[intro.races]/21:
[intro.races]/2:
[intro.memory]/3:
Two unrelated objects are definitely not the same 'memory location', so [intro.races]/21 doesn't apply.
However, [intro.object]/9 says:
This means that out of any two (unrelated) objects with overlapping storage, at most one can be within lifetime at any given point. [basic.life]/1.5 ensures this:
Accessing (reading or writing) an object outside its lifetime is not allowed ([basic.life]/4), and we've just established that
XandYcan't both be within lifetime at the same time. So, if both threads proceed to access the created objects, the behavior is undefined: at least one will be accessing an object whose lifetime has ended.