coost icon indicating copy to clipboard operation
coost copied to clipboard

协程共享栈缺陷

Open shuai132 opened this issue 1 year ago • 1 comments

BUG: 协程栈上数据的地址传递给其他协程处理时,可能出现错误。 边界条件:协程无法独占共享栈时(co_stack_num满)。

TestCase:

#include "co/co.h"

int main(int argc, char **argv) {
  flag::init(argc, argv);
  FLG_cout = true;
  flag::set_value("co_sched_num", "1");
  flag::set_value("co_stack_num", "1");
  // flag::set_value("co_sched_log", "true");

  go([&] {
    char buf[] = "test";
    LOG << "buf:1: " << buf;
    go([&] {
      LOG << "buf:2.1: " << buf; // error here: expect `text`
      buf[0] = 'T';
      LOG << "buf:2.2: " << buf; // error here: expect `Text`
      co::sleep(1);
    });
    co::sleep(1);
    LOG << "buf:3: " << buf; // error here: expect `Text`
    co::sleep(1);
  });

  co::sleep(10);
  return 0;
}

说明: 协程栈有多种实现方式,我还是更倾向于优先保证C++常见写法的正确性。 目前共享栈的方式容易出现上述问题,需要使用者避免此类写法。

我们是否可以考虑改为虚拟内存自动扩容的协程栈方式? @idealvin

shuai132 avatar Oct 03 '24 06:10 shuai132

64位系统可以考虑每个协程单独分配一个1M的栈

idealvin avatar Oct 06 '24 08:10 idealvin