skip to Main Content

I’m trying to diagnose a timing issue on a multi-core processor [Xeon Silver]. I think that the clocks have not been configured or synced between the processor. I’m using Eli Bendersky’s [credited in the code snippet] threading examples to build a test instrument. I have made three changes. I made made the sleep occur first, and I added a call to std::chrono::system_clock::now() and tried to print it out. I’m building with gcc 4.8.5 on CentOS 7.5.

The code is as follows:

// // Eli Bendersky [http://eli.thegreenplace.net]
// This code is in the public domain.
#include <algorithm>
#include <chrono>
#include <iostream>
#include <mutex>
#include <thread>
#include <vector>
#include <pthread.h>

int main(int argc, const char** argv) {
  unsigned num_cpus = std::thread::hardware_concurrency();
  std::cout << "Launching " << num_cpus << " threadsn";

  // A mutex ensures orderly access to std::cout from multiple threads.
  std::mutex iomutex;
  std::vector<std::thread> threads(num_cpus);
  for (unsigned i = 0; i < num_cpus; ++i)
  {
    threads[i] = std::thread([&iomutex, i]
    {
       // Simulate important work done by the tread by sleeping for a bit...
      std::this_thread::sleep_for(std::chrono::milliseconds(200));
      {
         std::chrono::time_point ti = std::chrono::system_clock::now();
         // Use a lexical scope and lock_guard to safely lock the mutex only for
         // the duration of std::cout usage.
         std::lock_guard<std::mutex> iolock(iomutex);
         std::cout << "Thread #" << i << " hit its clock at: " << ti.time_since_epoch() << "n";
       }
    });
  }

  for (auto& t : threads) {
      t.join();
  }
  return 0;
}

I build with make:

CXX = g++
CXXFLAGS = -std=c++11 -Wall -O3 -g -DNDEBUG -pthread
LDFLAGS = -lpthread -pthread

clock-check: clock-check.cpp
    $(CXX) $(CXXFLAGS) $^ -o $@ $(LDFLAGS)

GCC gives me the following error:

[user@sbc1 concur]$ make clock-check
g++ -std=c++11 -Wall -O3 -g -DNDEBUG -pthread clock-check.cpp -o clock-check -lpthread -pthread
clock-check.cpp: In lambda function:
clock-check.cpp:32:67: error: β€˜ti’ was not declared in this scope
      std::cout << "Thread #" << i << " hit its clock at: " << ti.time_since_epoch() << "n";
                                                               ^
make: *** [clock-check] Error 1

ti is clearly in the same block scope as the print statement, and I’m baffled why the compiler is complaining. I have not found any restrictions on variables local to the lambda. Most of what I have found has been references to captures.

3

Answers


  1. Class template deduction is not available until c++17, so you need to specify your template parameters for chrono::timepoint. Alternatively, use auto:

     auto ti = std::chrono::system_clock::now();
    

    Furthermore, you attempt to stream a chrono::duration type, which is not possible. Use ti.time_since_epoch().count().

    Live example

    Login or Signup to reply.
  2. Your problem lies in this line:

    std::chrono::time_point ti = std::chrono::system_clock::now();
    

    std::chrono::time_point expect a type argument (e.g. std::chrono::time_point<std::chrono::system_clock>)

    Prefer to use auto in this case:

    auto ti = std::chrono::system_clock::now();
    

    Then, you’ll have an error since you try to output a std::chrono::duration in an output stream.

    You should do:

    std::cout << "Thread #" << i << " hit its clock at: " << ti.time_since_epoch().count() << "n";
    
    Login or Signup to reply.
  3. It seems to be a bug in older gcc versions. With gcc 10.1 (–std=c++11) I get the error:

    <source>: In lambda function:   
    <source>:23:34: error: missing template arguments before 'ti'    
       23 |          std::chrono::time_point ti = std::chrono::system_clock::now();    
          |                                  ^~    
    <source>:27:67: error: 'ti' was not declared in this scope; did you mean 'i'?    
       27 |          std::cout << "Thread #" << i << " hit its clock at: " << ti.time_since_epoch() << "n";    
          |                                                                   ^~    
          |            
    

    The error about the missing template parameter (which is missing with gcc 4.5.8) on the declaration explains the second error.

    Strangely gcc 4.8.5 with -std=c++11 happily compiles the code if you remove the line with std::cout: https://godbolt.org/z/6LREHF

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search