include: co/co.h.
#线程
v3.0.1 删除了co/thread.h
头文件,移除了全局的Thread
与Mutex
类,其功能与 C++11 中的std::thread
与std::mutex
一样,用户可以直接使用 std 版本。
#co::thread_id
uint32 thread_id();
- 返回当前线程的 id 值。
#co::sync_event
同步事件是多线程间的一种同步机制,适用于生产者-消费者模型。消费者线程调用 wait()
方法等待同步信号,生产者线程则调用 signal()
方法产生同步信号。co::sync_event
支持多生产者、多消费者,但实际应用中,单个消费者的情况比较多。
v3.0.1 移除了全局范围的SyncEvent
,请使用co::sync_event
替代之。
#constructor
explicit sync_event(bool manual_reset=false, bool signaled=false);
- 构造函数,参数
manual_reset
表示是否手动将同步状态设置成未同步,参数signaled
表示初始状态是否为同步状态。
#sync_event::reset
void reset();
- 将事件设置成未同步状态。
- 当构造函数中
manual_reset
为 true 时,用户在调用 wait() 后需要手动调用此方法,将事件设置成未同步状态。
#sync_event::signal
void signal();
- 产生同步信号,将事件设置成同步状态。
#sync_event::wait
1. void wait();
2. bool wait(uint32 ms);
- 1, 一直等待直到事件变成同步状态。
- 2, 等待直到事件变成同步状态或超时。参数
ms
指定超时时间,单位为毫秒。若事件变成同步状态,返回 true,否则返回 false。 - 当构造函数中
manual_reset
为 false 时,wait() 结束时会自动将事件设置成未同步状态。
#代码示例
#include "co/co.h"
bool manual_reset = false;
co::sync_event ev(manual_reset);
void f1() {
if (!ev.wait(1000)) {
LOG << "f1: timedout..";
} else {
LOG << "f1: event signaled..";
if (manual_reset) ev.reset();
}
}
void f2() {
LOG << "f2: send a signal..";
ev.signal();
}
int main(int argc, char** argv) {
std::thread(f1).detach();
std::thread(f2).detach();
co::sleep(3000);
return 0;
}
#co::tls
template<typename T>
class tls;
co::tls
对系统的 thread local 接口进行封装。
v3.0.1 中移除了thread_ptr
,取而代之提供了co::tls
。
#constructor
tls();
- 构造函数,分配系统资源及初始化。
#tls::get
T* get() const;
- 返回当前线程拥有的指针值。
#tls::set
void set(T* p);
- 设置当前线程拥有的指针值。
#tls::operator->
T* operator->() const;
- 返回当前线程拥有的指针值。
#tls::operator*
T& operator*() const;
- 返回当前线程拥有指针所指向对象的引用。
#operator==
bool operator==(T* p) const;
- 判断当前线程所拥有的指针是否等于
p
。
#operator!=
bool operator!=(T* p) const;
- 判断当前线程所拥有的指针是否不等于
p
。
#operator bool
explicit operator bool() const;
- 当前线程所拥有的指针不是 NULL 时,返回 true,否则返回 false。