- 主题:初学Rust共享变量在无限循环中使用的问题
有一个项目,是单线程的,所以希望能够避免mutex这种,最多用RefCell。现在定义一个类/结构。因为是初学,下面就是示意一下,基本功能就是两个函数,其中一个是add_watcher,把一个watcher加到vector里面。
struct Server{
watchers: RefCell<Vec<Listener>>, //Listener类实现一个函数update
}
impl Server{
pub async fn add_watcher(&self, watcher:Listner) {
self.watcher.borrow().push(watcher);
}
pub async fn background(&self) {
// 这里需要一个无限循环,每秒钟运行一次
// 要求每隔一秒钟产生一个随机数,然后调用update
for w in .... {
w.update(...);
}
}
}
另一个是一个重点,就是需要1秒钟调用每个watcher.update(随机数)。像这种每秒钟运行一次,我感觉理论上并不是多线程,因为本质上就是有时间就通知每个watcher,然后尽量满足把新的watcher加到vector里面。这个能否避免Mutex?
--
FROM 72.199.121.*
单线程,background和add-watcher是如何同时工作的?
【 在 bihai 的大作中提到: 】
: 有一个项目,是单线程的,所以希望能够避免mutex这种,最多用RefCell。现在定义一个类/结构。因为是初学,下面就是 ...
--
FROM 124.64.18.*
名字叫background,目的是用coroutine这种,主动放弃执行。比如每秒钟一个任务很快就结束了,就可以做add-watcher。这个时候就看消息队列有没有信号。如果有,那就是add-watcher,如果没有,就安排一个演示的消息,等待下一次处理。
【 在 AlphaO 的大作中提到: 】
: 单线程,background和add-watcher是如何同时工作的?
:
--
FROM 72.199.121.*
coroutine就是用户态多线程吧,本质上也是需要多线程定那一套来实现互斥。如果用tokio,框架有提供mutex,而不要用std的那一套
--
FROM 183.179.126.*
发现不需要互斥,需要共享,最后发现需要Rc<RefCell<Vec>>>。就是说在我这个需求中不存在一个函数正在修改一个vector的时候,还没做完,另一个函数来访问这个vector。我的需求只是一个函数访问vector,结束后,主动放弃,然后另一个再处理同一个vector。
因为这个程序本质是单线程的,类似于一个网站服务器,处理http请求,返回一个页面,写着Hello <n>,这里n是该请求接到时的内部的一个变量的值。这个变量要求每秒钟加1。一个方案是这个单线程程序有一个消息队列。在队列中插入一个未来一秒种后做的任务,如果有外界请求,则立即处理,返回页面。否则就等到一秒种到之后,把变量n加1,然后生成新的未来任务插入队列。
另一个方案是我说的Task::local一个循环,里面每隔一秒种给变量n加1。这里就需要Rc<RefCell<u64>>即可。
【 在 cutepig 的大作中提到: 】
: coroutine就是用户态多线程吧,本质上也是需要多线程定那一套来实现互斥。如果用tokio,框架有提供mutex,而不要用std的那一套
--
修改:bihai FROM 72.199.121.*
FROM 72.199.121.*
两个函数轮流使用变量,看似不需要共享
【 在 bihai 的大作中提到: 】
: 名字叫background,目的是用coroutine这种,主动放弃执行。比如每秒钟一个任务很快就结束了,就可以做add...
--
FROM 221.218.141.*
rust编译器是保守的,他为了安全性定义了一些规则,这些规则可能会比你实际的需要更严格。你虽然人手保证了一个corouti。r操作完gectot才会给下一个,但编译器不知道,他为了安全性,只能假设你可能乱搞,而为了不出问题,他就要求你必须使用互斥保证没问题
--
FROM 124.217.189.*
因为规定了单线程,所以编译器可以编译出来,不需要Mutex
【 在 cutepig 的大作中提到: 】
: rust编译器是保守的,他为了安全性定义了一些规则,这些规则可能会比你实际的需要更严格。你虽然人手保证了一个corouti。r操作完gectot才会给下一个,但编译器不知道,他为了安全性,只能假设你可能乱搞,而为了不出问题,他就要求你必须使用互斥保证没问题
--
FROM 72.199.121.*
共享还是需要的,因为要把变量放到closure里面去,不知道我这个名词用的对不对,就像C++的lambda那样
【 在 AlphaO 的大作中提到: 】
: 两个函数轮流使用变量,看似不需要共享
--
FROM 72.199.121.*
编译过了吗?
你的想法,估计编译器不让你过.
【 在 bihai 的大作中提到: 】
: 共享还是需要的,因为要把变量放到closure里面去,不知道我这个名词用的对不对,就像C++的lambda那样
:
--
FROM 117.147.20.*