- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试实现一个基于领导者/追随者并发架构的基本服务器。我最初只想创建一个线程池并创建一个线程队列,但在阅读此答案 (Explain "Leader/Follower" Pattern) 后,我觉得我的算法不正确,因为所选答案声称不需要互斥锁。
leader/follower 背后的思想是,你初始化一个线程池,一个线程作为“leader”线程,其余的都是“follower”线程。在服务器中,领导线程将监听传入的连接,而跟随者线程则全部休息。当领导线程检测到传入连接时,其中一个空闲的跟随者线程将被提升为新的领导线程,而前领导线程接受连接并为请求提供服务。当前领导线程完成请求服务后,它成为休息的跟随者线程。
但是,如果不使用互斥锁和条件变量,我看不到任何实现方法。目前我的实现使用线程池,并且只允许每个线程在互斥体中接受新连接。
有人可以提供领导者/追随者实现的高级解释吗?
这是我为当前实现编写的一些代码。
#define THREAD_COUNT 10
pthread_mutex_t request_tx;
int main(int argc, char* argv[])
{
pthread_t threadA[THREAD_COUNT];
pthread_mutex_init(&request_tx, NULL);
//initialize server socket stuff
for (int i = 0; i < THREAD_COUNT; ++i)
{
pthread_create(&threadA[i], NULL, rest, NULL);
}
for (int i = 0; i < THREAD_COUNT; ++i)
pthread_join(threadA[i], NULL);
return 0;
}
void* rest(void* kargs)
{
int client_fd;
struct sockaddr_in cli_addr;
socklen_t sin_t = sizeof(cli_addr);
while (1)
{
pthread_mutex_lock(&request_tx);
client_fd = accept(server_fd, (struct sockaddr*) &cli_addr, &sin_t);
if (client_fd > 0)
serve(client_fd);
else
pthread_mutex_unlock(&request_tx);
}
}
void serve(int client_fd)
{
pthread_mutex_unlock(&request_tx);
// serve request here
...
}
最佳答案
链接的答案是错误的。同步在某处绝对是必要的。在您的示例中,您可以删除互斥锁,因为 accept
将在内核中阻塞,并且(大多数?)实现将为传入连接激活一个线程。但是,内核内部仍然存在一些同步。
您的示例有点误导,因为领导者/追随者模式通常用于将单个请求 分配到线程池的多个连接上,而不是连接。在这一点上,事情变得相当复杂,因为完成处理的跟随者需要告诉领导者一个新的连接需要监视。如果您仅限于标准 POSIX 接口(interface),这可能会非常复杂。 (使用 epoll
,应该可以将大部分复杂性移交给内核。)
一般来说,我会谨慎采用 90 年代的事件处理模式。从那时起架构发生了显着变化:NUMA 机器不再稀有,系统可以相当轻松地在单个进程中处理数万个线程,并且可以使用其他事件处理接口(interface),例如 epoll
。
关于c - 服务器中的 Leader/Follower pthread 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50673979/
我正在尝试创建一个类似 Twitter 的关注/关注系统。表格设计是这样的 - leader_id | following_id | is_mutual 1 |
尊敬的数据库专家/程序员: 我有一个mysql表,里面有用户信息,比如 id user_id name etc. 1 userA 2
我正在尝试设置我的 User GraphQL 模型以具有要查询的 followers 和 following 属性。但是,我无法在 Sequelize 中建立关系。我正在尝试使用 Follower 模
在我的网站上,我有一个类似 twitter 的概念,我有一个具有以下结构的用户连接表, ============================================= ==========
下面列出的区别是什么: 最佳答案 首先,你知道Meta Robots Tags吗?Meta Robots Tags 是告诉蜘蛛或爬虫要抓取或索引哪些页面。 跟随意味着:页面将被抓取。 No
我正在做一些项目,我在考虑关注者和像推特这样的关注系统。我在数据库中有成员表。我怎样才能做关注者系统。逻辑是什么?我做了类似的事情:我创建了名称跟随的新表,我有 3 行。这些行是 id、user_id
这是用于 C 代码检测。我正在尝试标记没有中断的 case 语句。当 break 语句之前有多行时,树的层次结构如下所示。这是 C 中的示例: switch (x) { case 1: i
大家好,我正在使用 MySQL 和 PHP 制作关注者/被关注系统,所以我想获取我关注的用户的所有视频并按 ID 描述排序。 数据库架构: 例如,如果我的 user_id = 1,并且如果我正在关注
我正在尝试根据#following #followers 找到一个计算推特用户“重要性”的方程式 我要考虑的事情: 1. #followers/#following越多,他越重要。 2. 在 20/2
这是我得到的错误 undefined method `followed_users?' for # 提取的源代码(大约第 3 行): 1: 2: 3: 4: 5: 6:
我有一个用户模型,可以创建关系以拥有关注者并关注其他人,我从 Rails 教程中学到的一切都非常有效。一件事是,我正在尝试通过添加能够看到其他人的关注者并能够拥有关注/关注按钮选项的选项来将其推进到下
我正在尝试通过 Twitter Javascript Api(请参阅 here )检查登录用户是否在 Twitter 上关注我。如果没有,我将显示一个关注按钮。现在我似乎无法找出命令 isFollow
我希望能够使用 iOS 5 的 Twitter API 将所有用户关注者和关注者用户名放入 NSDictionary... 不过我遇到了障碍。我不知道如何使用 Twitter API 来执行此操作..
希望在域之后但在其他任何内容之前获取值。 因此 URL 的示例是: www.domain.com/following#2 我只想从该 url 中获取后面的单词。 目前有这个可以重定向用户并在任何片段等
我有下表: 关系 id、follower_id、followee_id、状态 用户 id、姓名、电子邮件 我想查找正在关注或被特定用户关注的所有用户。 这是我到目前为止所拥有的,但速度非常慢: SEL
我是 state Management 的新手,正在使用 provider package 。产生这些类型的异常有多少种不同的原因,我该如何解决,此异常是在 didChangeDependencies
所以我在这里尝试制作一个类似 Instagram 的应用程序,但仅适用于汽车,我尝试单击“关注”和“关注者”来查看我关注的人和关注我的人,但我不确定为什么会有NPE吗... 我成功地可以关注用户,用户
我是 state Management 的新手,正在使用 provider package 。产生这些类型的异常有多少种不同的原因,我该如何解决,此异常是在 didChangeDependencies
我讨厌发布“这应该很容易,我错过了什么”问题,但是......这应该很容易,我错过了什么?我在这个测试代码上没有得到匹配,我不明白为什么。模式是(或应该是)“任何三个数字,后跟任何三个相同的数字,后跟
我正在研究 Chapter 11在 Hartl 的教程中,试图让用户 Controller 中的未登录用户访问关注者和关注页面通过。我遇到了一个错误,Rails 会提示未定义的 admin? 方法,尽
我是一名优秀的程序员,十分优秀!