加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
coding rules.txt 4.36 KB
一键复制 编辑 原始数据 按行查看 历史
firefirer1983 提交于 2018-06-11 13:51 . release books
1. const要用好,const的变量,const的成员函数,const的指针。
2. xxx_cast要用好,所有的隐形转换都要用static_cast来显示标出,用好dynamic_cast,implicity_cast
3. 用好智能指针 unique_ptr 和 shared_ptr,不用delete来释放。
4. 所有的数组尽量用 vector<type> arry_来替换。
5. 用好 std::move 和 std::forward
6. 用好 std::bind 和 std::function
7. 用好 std::mutex 和 std::lock_guard
8. 用好 std::swap,std::search,std::copy,std::find iter_swap std::is_same, std::find, memchr, find_end
9. 用好 size_t 和 ssize_t
10. 用好int8_t,int16_t,int32_t,int64_t
11. 用好name_space
12. const变量要以 kInitSize的方式命名
13. 成员变量要以 fileNumber_的方式命名。
14. 非成员变量 savedErrno
15. 类名 Buffer
16. 类成员函数 readBuffer()
17. 用下面的方式初始化类成员:
Channel::Channel(EventLoop* loop, int fd__)
: loop_(loop),
fd_(fd__),
events_(0),
revents_(0),
index_(-1),
logHup_(true),
tied_(false),
eventHandling_(false),
addedToLoop_(false)
{
}
18. typedef 定义的类型和普通类的写法一样:
typedef boost::function<void()> EventCallback;
19.用好copyable和noncopyable
20. 用好explicit,单参数的构造函数,或者多参数的构造函数,但是只有一个参数没有默认值的,最好都要用explicit来明示
21. 熟悉使用:
__thread
pthread_t
pthread_key_t
pthread_cond_t
pthread_mutex_t
pthread_once_t
pthread_cond_init
pthread_cond_destroy
pthread_cond_timedwait
pthread_cond_signal
pthread_cond_broadcast
pthread_mutex_init
pthread_mutex_destroy
pthread_mutex_lock
pthread_mutex_unlock
pthread_once
pthread_create
pthread_exit
pthread_detach
pthread_atfork
pthread_key_create
pthread_key_delete
pthread_getspecific
pthread_setspecific
pthread_atfork
22.
a. 重新包装一个Thread类,好处是可以统一命名线程名字,而且还可以统计线程数量(通过static 类数据成员的方式,所有的实体共享一个变量,每次新增线程就 + 1)
b. 可以记录当前lock的线程的名字,方便防止和查找死锁的原因。
23. 熟悉 CAS等原子操作
type __sync_fetch_and_ops(type *ptr, type value, ...)
/* equals */
type tmp = *ptr;
*ptr ops = value;
return tmp;
type __sync_ops_and_fetch(type *ptr, type value, ...)
/* equals */
*ptr ops = value;
return *ptr;
bool __sync_bool_compare_and_swap(type *ptr, type oldval, type newval)
/* equals */
bool res
if( res = (*ptr == oldval)){
*ptr = newval;
}
return res;
type __sync_val_compare_and_swap(type *ptr, type oldval, type newval)
/* equals */
type tmp = *ptr;
if(*ptr == oldval){
*ptr = newval;
}
return tmp;
type __sync_lock_test_and_set ( type *ptr, type value, ...)
__builtin_expect
if (__builtin_expect(t_cachedTid == 0, 0))
{
cacheTid();
}
24. 熟悉 std::enable_shared_from_this 和 shared_from_this();
25. for_each + bind ,将vector内的所有的对象的指定成员函数函数都运行一遍
for_each(threads_.begin(),
threads_.end(),
boost::bind(&muduo::Thread::join, _1));
26. 熟悉timerfd,eventfd的使用
27. 如果需要在程序开始的时候进行自动的初始化函数,必定是在主线程内做的:
class ThreadNameInitializer
{
public:
ThreadNameInitializer()
{
muduo::CurrentThread::t_threadName = "main";
CurrentThread::tid();
pthread_atfork(NULL, NULL, &afterFork);
}
};
ThreadNameInitializer init;
28. 通过tie的方式,将两个对象绑定在一起:
将TcpConnection和Channel的对象绑定:
void TcpConnection::connectEstablished()
{
loop_->assertInLoopThread();
assert(state_ == kConnecting);
setState(kConnected);
channel_->tie(shared_from_this());
channel_->enableReading();
connectionCallback_(shared_from_this());
}
void Channel::tie(const std::shared_ptr<void>& obj)
{
tie_ = obj;
tied_ = true;
}
void Channel::handleEvent(Timestamp receiveTime)
{
std::shared_ptr<void> guard;
if (tied_)
{
guard = tie_.lock();
if (guard)
{
handleEventWithGuard(receiveTime);
}
}
else
{
handleEventWithGuard(receiveTime);
}
}
29. 当在一个类里面想要用 const int kWaterMark = 10; 类似的方式定义一个常量在构造函数中使用,必需要定义为 static 的类型,因为只有static类型的变量会在先于构造函数初始化。
30. 如何处理EWOULDBLOCK,EPIPE,ECONNRESET
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化