c++ gettimeofday thread safe

在 C++ 中,gettimeofday() 函数是用于获取当前时间的函数,它返回一个 timeval 结构体,其中包括当前的秒数和微秒数。在多线程环境下,如果多个线程同时调用 gettimeofday() 函数,就会存在线程安全的问题。

这是因为 gettimeofday() 函数在获取时间时需要访问系统内核中的全局变量,如果多个线程同时对这些变量进行访问和修改,就会导致数据不一致或者出现竞争条件的情况,进而导致程序出现异常或者崩溃。

为了解决这个问题,我们可以采用两种方法:

  • 使用线程安全的函数代替 gettimeofday() 函数。
  • 在 Linux 中,我们可以使用 clock_gettime() 函数来替代 gettimeofday() 函数,它可以返回更高精度的时间,并且在多线程环境下是线程安全的。在 Windows 中,我们可以使用 QueryPerformanceCounter() 函数来替代 gettimeofday() 函数。

  • 加锁来保护 gettimeofday() 函数的调用。
  • 我们可以使用互斥锁或者读写锁来保护 gettimeofday() 函数的调用,从而保证多个线程在访问和修改全局变量时不会发生冲突。例如,可以在每个线程调用 gettimeofday() 函数之前先获取一个互斥锁,然后在获取到锁之后才执行 gettimeofday() 函数,最后再释放锁。这样就能够保证线程安全。

    需要注意的是,使用锁会带来一定的性能开销,因此应该尽量减少锁的使用,只在必要的情况下才加锁。此外,在使用锁的时候,还要注意避免死锁和饥饿等问题。

  • CxxJDK: 山寨 JDK 实现的 C++ 强大类库 特点 * 跨平台:同时支持 Linux32/64、OSX64、Win64 等平台; * 高性能:同时具备 C/C++ 和 Java 并发库的优点,性能爆棚; * 类丰富:实现 JDK 丰富的类库,从此摆脱 C++ 贫类库的困境; * 易开发:先 java 开发,再使用 CxxJDK 进行翻译,So easy! 示例 java: public static void main(String[] args) { class Worker implements Runnable { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(String.format("thread %d finished", this.hashCode())); } } ThreadPoolExecutor executor = new ThreadPoolExecutor(100, 200, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); executor.allowCoreThreadTimeOut(true); for (int i = 0; i < 200; i++) { executor.execute(new Worker()); } executor.shutdown(); } //===================================== c++: int main(int argc, const char **argv) { ESystem::init(argc, argv); //cxxjdk 初始化! class Worker : public ERunnable { public: virtual void run() { try { EThread::sleep(1000); } catch (EInterruptedException& e) { e.printStackTrace(); } ESystem::out->println(EString::formatOf("thread %d finished", this->hashCode()).c_str()); } }; EThreadPoolExecutor* executor = new EThreadPoolExecutor(100, 200, 10, ETimeUnit::SECONDS, new ELinkedBlockingQueue<ERunnable>()); executor->allowCoreThreadTimeOut(true); for (int i = 0; i < 200; i++) { executor->execute(new Worker()); } executor->shutdown(); executor->awaitTermination(); delete executor; // 对象资源释放! }
  •