码迷,mamicode.com
首页 > 其他好文 > 详细

muduo: Exception Thread Mutex

时间:2021-03-18 14:42:02      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:without   程序   exce   back   namespace   int   UNC   using   ediff   

注释过的源码太多就不放在这,可以去GitHub查看

下面是测试程序:

#include "Exception.h"
#include <iostream>

class Bar {
public:
  void test() {
    throw::muduo::Exception("oops"); // 抛出异常
  }  
};

void foo() {
  Bar b;
  b.test();
}

int main()
{
  try {
    foo(); // 运行此函数 会抛出 oops 异常
  }
  catch (const muduo::Exception& ex) {  // 捕捉异常 并打印异常信息
    std::cout << "reason: " << ex.what() << std::endl;
    std::cout << "stack trace: " << ex.stackTrace() << std::endl;
  }

  return 0;
}
#include <iostream>
#include <string>
#include <functional>
#include <stdio.h>
#include <unistd.h>
#include "Thread.h"
#include "CurrentThread.h"

void threadFunc() {
  std::cout << "tid = " << muduo::CurrentThread::tid() << std::endl;
}

void threadFunc2(int x) {
  std::cout << "tid = " << muduo::CurrentThread::tid() << " x = " << x << std::endl;
}

class Foo {
public:
  explicit Foo(double x) : x_(x) {}
  
  void memberFunc2(const std::string& text) {
    std::cout << "tid = " << muduo::CurrentThread::tid() << " Foo::x_ = " << x_ << " text = " << text << std::endl;
  }

private:
  double x_;
};

int main()
{
  std::cout << "pid = " << ::getpid() << " tid = " << muduo::CurrentThread::tid() << std::endl;

  muduo::Thread t1(threadFunc);
  t1.start();
  t1.join();

  muduo::Thread t2(std::bind(threadFunc2, 42), "thread for free function with argument");
  t2.start();
  t2.join();

  Foo foo(87.35);
  //muduo::Thread t3(std::bind(&Foo::memberFunc2, &foo);
  //t3.start();
  //t3.join();

  muduo::Thread t4(std::bind(&Foo::memberFunc2, &foo, "thread for member function with argument"));
  t4.start();
  t4.join();

  std::cout << "number of created threads " << muduo::Thread::numCreated() << std::endl;

  return 0;
}
#include "Mutex.h"
#include "Thread.h"
#include "Timestamp.h"

#include <functional>
#include <vector>
#include <iostream>
#include <boost/ptr_container/ptr_vector.hpp>
using namespace muduo;
using namespace std;

MutexLock g_mutex;
vector<int> g_vec;
const int kCount = 10*1000*1000;

void threadFunc() {
  for (int i = 0; i < kCount; i++) {
    MutexLockGuard lock(g_mutex);
    g_vec.push_back(i);
  }
}

int main()
{
  const int kMaxThreads = 8;
  g_vec.reserve(kMaxThreads * kCount);

  Timestamp start(Timestamp::now());

  // 仅仅push_back
  for (int i = 0; i < kCount; i++) {
    g_vec.push_back(i);
  }

  // push_back kCount个数所用的时间
  cout << "single thread without lock " << timeDifference(Timestamp::now(), start) << endl;

  start = Timestamp::now();

  // push_back + MutexLockGuard的构造析构
  threadFunc(); // 
  cout << "single thread with lock " << timeDifference(Timestamp::now(), start) << endl;

  for (int nthreads = 1; nthreads < kMaxThreads; ++nthreads) {
    boost::ptr_vector<Thread> threads;
    g_vec.clear();
    start = Timestamp::now();

    for (int i = 0; i < nthreads; ++i) {
      threads.push_back(new Thread(&threadFunc));
      threads.back().start();
    }

    for (int i = 0; i < nthreads; ++i) {
      threads[i].join();
    }

    cout << nthreads << " threads with lock " << timeDifference(Timestamp::now(), start) << endl;
  }

  return 0;
}

// g++ Timestamp.cc CountDownLatch.cc CurrentThread.cc Thread.cc Mutex_test.cc -o Mutex_test -lpthread

 

muduo: Exception Thread Mutex

标签:without   程序   exce   back   namespace   int   UNC   using   ediff   

原文地址:https://www.cnblogs.com/lnlin/p/14554012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!