Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env bash
- set -o errexit
- set -o verbose
- set -o xtrace
- g++ -x c++ - -std=gnu++1y -Wall -Wextra -Werror -Wconversion <<__EOF && ./a && echo -e "\e[1;31mOK\e[0m" || echo -e "\e[1;31mfailed!\e[0m"
- #include <iostream>
- #include <thread>
- //#include <mutex>
- #include <limits>
- #include <cstdint>
- #include <cstdlib>
- using T = std::uintmax_t;
- volatile T globalvalue;
- template< bool upper >
- struct reader
- {
- static
- T constexpr value = upper ? 0 : ~static_cast< T >(0);
- void operator () () const
- {
- for (;;) {
- globalvalue = value;
- //std::cout << std::boolalpha << upper << std::endl;
- }
- }
- };
- int main() // __attribute__((__noreturn__))
- {
- static_assert(std::is_unsigned< T >::value, "Type T is erroneously signed!");
- std::thread r0((reader< true >()));
- std::thread r1((reader< false >()));
- for (;;) {
- volatile T copyvalue = globalvalue;
- if ((copyvalue == reader< true >::value) != (copyvalue == reader< false >::value)) {
- //std::cout << std::boolalpha << (copyvalue == reader< true >::value) << std::endl;
- } else {
- std::cerr << "!" << copyvalue << std::endl;
- }
- }
- return EXIT_SUCCESS;
- }
- __EOF
Advertisement
Add Comment
Please, Sign In to add comment