什么是 IO 模型
更新时间:2022-05-09 06:05
最满意答案
#include #include #include string.h> #include #include #include #define TRUE 1static const char* state2String(int state) { if (state == 0)return "CLOSED_STATE"; if (state == ZOO_CONNECTING_STATE)return "CONNECTING_STATE"; if (state == ZOO_ASSOCIATING_STATE)return "ASSOCIATING_STATE"; if (state == ZOO_CONNECTED_STATE)return "CONNECTED_STATE"; if (state == ZOO_EXPIRED_SESSION_STATE)return "EXPIRED_SESSION_STATE"; if (state == ZOO_AUTH_FAILED_STATE)return "AUTH_FAILED_STATE"; return "INVALID_STATE"; } static const char* type2String(int state) {if (state == ZOO_CREATED_EVENT)return "CREATED_EVENT"; if (state == ZOO_DELETED_EVENT)return "DELETED_EVENT"; if (state == ZOO_CHANGED_EVENT)return "CHANGED_EVENT"; if (state == ZOO_CHILD_EVENT)return "CHILD_EVENT"; if (state == ZOO_SESSION_EVENT)return "SESSION_EVENT"; if (state == ZOO_NOTWATCHING_EVENT)return "NOTWATCHING_EVENT";return "UNKNOWN_EVENT_TYPE"; } void zktest_dump_stat(const struct Stat *stat) {char tctimes[40];char tmtimes[40]; time_t tctime; time_t tmtime;if (!stat) { fprintf(stderr,"null\n"); return; } tctime = stat->ctime/1000; tmtime = stat->mtime/1000; ctime_r(&tmtime, tmtimes); ctime_r(&tctime, tctimes); fprintf(stderr, "\tctime = %s\tczxid=%llx\n""\tmtime=%s\tmzxid=%llx\n""\tversion=%x\taversion=%x\n""\tephemeralOwner = %llx\n", tctimes, stat->czxid, tmtimes, stat->mzxid, (unsigned int)stat->version, (unsigned int)stat->aversion, stat->ephemeralOwner); } void zktest_data_completion(int rc, const char *value, int value_len, const struct Stat *stat, const void *data) { fprintf(stderr, "in data completion [%s]: rc = %d\n", value, rc); zktest_dump_stat(stat); } /*process a list of string and stat*/void zktest_strings_stat_completion(int rc, const struct String_vector *strings, const struct Stat *stat, const void *data) {int i=0; fprintf(stderr, "in strings state completion [%s]: rc = %d, string count %d\n", (char *)data, rc, strings ->count);for (i=0; icount; i++) { printf("%d: %s\n", i, strings->data[i]); } deallocate_String_vector(strings); zktest_dump_stat(stat); }void zktest_string_completion(int rc, const char *name, const void *data) { fprintf(stderr, "in string completion [%s]: rc = %d\n", (char*)(data==0?"null":data), rc); if (!rc) { fprintf(stderr, "\tname = %s\n", name); } }void zktest_stat_completion(int rc, const struct Stat *stat, const void *data) {if (rc == ZNONODE) { printf("node not exists\n"); } fprintf(stderr, "in state completion rc = %d data=%s stat:\n", rc, (char *)data); zktest_dump_stat(stat); }
其他回答
CuratorFramework Curator框架提供了一套高级的API, 简化了ZooKeeper的操作。 它增加了很多使用ZooKeeper开发的特性,可以处理ZooKeeper集群复杂的连接管理和重试机制。 这些特性包括: 自动化的连接管理: 重新建立到ZooKeeper的连接和重试机制存在一些潜在的错误case。 Curator帮助你处理这些事情,对你来说是透明的。 清理API: 简化了原生的ZooKeeper的方法,事件等 提供了一个现代的流式接口 提供了Recipes实现: 如前面的文章介绍的那样,基于这些Recipes可以创建很多复杂的分布式应用 Curator框架通过CuratorFrameworkFactory以工厂模式和builder模式创建CuratorFramework实 例
相关问答
更多-
如何确定已有工具类访问zookeeper的线程安全性[2023-11-22]
#include #include #include string.h> #include #include #include #define TRUE 1static const char* state2String(int state) { if (state == 0)return "CLOSED_STATE"; if (state == ZOO_CONNECTING_STATE)return "CONNECTING_STATE"; if (state == ZOO_ASSOCIATING_STATE ... -
Boost中有一个类似的库, boost :: atomic,但它尚未包含在标准的AFAIK中。 There is a similar library in Boost, boost::atomic but it's not yet included in the standard AFAIK.
-
好吧,我暂时忽略任何SQL的东西,只关注uniqueInvocationNumber部分。 这里有两个问题: 无法保证线程在任何特定点都能看到最新值 增量不是原子的 在Java中解决此问题的最简单方法是使用AtomicInteger : private static final AtomicInteger uniqueInvocationNumber = new AtomicInteger(); public static Whatever getData(ValidatedQuery validated ...
-
这个线程的安全性如何?(How thread safe is this?)[2021-12-04]
从多个线程读取内存是线程安全的。 当你在遇到麻烦的同时改变和阅读记忆时。 Reading memory from multiple threads is thread safe. Its when you're changing and reading memory at the same time that you run into troubles. -
不,你没有使这些调用是线程安全的 - 因为_stringArrayList字段是受保护的。 子类可以做任何他们喜欢的事情,而AddString和ToString被调用。 例如(另一个答案声称你的代码是线程安全的。) public class BadStringMe : StringMe { public void FurtleWithList() { while (true) { _stringArrayList.Add("Eek!") ...
-
首先,让你的课程实现一个合适的界面。 这样,客户可以测试他们的行为,而不需要真正的文件。 测试线程的安全性是很难的 - 我从来没有看到任何在这方面非常有用的东西,但这并不是说工具不在那里。 对于单元测试你的课程,我建议如果可能的话,它应该使用一般的流而不仅仅是一个文件。 然后,您可以在测试程序集中嵌入不同的测试文件,并使用GetManifestResourceStream引用它们。 过去我已经做了好几次,取得了很大的成功。 Firstly, make your class implement an appr ...
-
HttpContext的线程安全性(Thread safety of HttpContext)[2022-02-20]
HttpContext类不是线程安全的。 例如, HttpContext.Items属性只是对非同步Hashtable的引用 - 因此这显然不是线程安全的。 从你的问题中不清楚你想要在并行任务之间分享什么,但我建议你使用你自己的线程安全类的实例来共享任务之间的状态,而不是试图包装现有的类。 The HttpContext class is not thread-safe. For example, the HttpContext.Items property is just a reference to a ... -
这是shared_ptr用于实现线程安全的有趣用法。 是否正常取决于boost::shared_ptr的线程安全保证。 特别是,它是否建立了某种类型的fence或membar,以便保证在指针值的任何修改变为可见之前,构造函数和set insert函数中的所有写入都会发生。 我在智能指针的Boost文档中找不到任何线程安全保证。 这让我感到震惊,因为我确信有一些。 但是快速查看1.47.0的源代码显示无,并且在线程环境中使用boost::shared_ptr将会失败。 (请有人请指出我缺少的东西。我无法相信b ...
-
您不指定数据的结构,但通常同时从多个线程读取内存是安全的,不会引入任何性能问题。 如果有人写作,你只会遇到问题。 有趣的是,你说你只能在两个线程中加速30%。 如果你有一台空闲的机器,两个或两个以上的CPU,并且只有只读共享数据(即没有同步),我希望看到更接近50%的速度提升。 这表明您的操作实际上很快完成,创建线程的开销在您的数字中变得非常重要。 你是在超线程CPU上运行吗? You don't specify how your data is structured, but in general rea ...
-
我觉得你对Java如何运作有点困惑。 如果你有一个A类而一个B extends A类B extends A ,当你实例化B就有一个B 它不像A支持所有B实例的单个实例。 没有“基类管理”。 通过XML,注释或约定声明为动作的类由Struts动作实例化机制实例化。 扩展ActionSupport (几乎)与它无关,它可能与它有关的唯一时间是因为ActionSupport实现了Action接口。 I think you're a bit confused about how Java works. If you ...