---------------------------------------------------------------------------------------------------------------------------------------
코드를 보다 문득 create_workqueu 와 create_singlethread_workqueue의 차이가 잘 이해가가지 않아서 문의 드립니다.
kernel/workqeueue.c 를 보니
create_singlethread_worqueue는 singthread_cpu (현재 동작하는 cpu로 생각됨)에 thread는 하나 생성하고
create_singlethread_worqueus는 모든 cpu에 workqueue thread를 생성 하는듯 합니다.
그렇다면 create_workqueue는 모든 cpu에 workqueue thread를 생성하여 work의 func함수를 호출 하게 되는건가요?
create_singthread_workqueue는 한개의 cpu에서만 work의 func이 호출 되구요.
이게 맞다면 여러개의 cpu에서 동시에 같은 목적의 work의 func함수가 실행되어 위험하지 않는지 궁금합니다.
만약 create_workqueu와 create_singlethread_workqueue를 사용 해야 한다면 어떤 기준으로 구분해서 사용 해야 할까요?
흠..질문만 잔뜻 올린듯 합니다.
감사합니다~
-------------------------------------------------------------------------------------------------------------------------------------
위에 글은 이전에 2010.12.24 김영민 님이 올리신 질문인데 답글이 없네요
저도 궁금해서 혹시 아시는분 가르침 부탁드립니다!!!!
.
/**
* alloc_ordered_workqueue - allocate an ordered workqueue
* @fmt: printf format for the name of the workqueue
* @flags: WQ_* flags (only WQ_FREEZABLE and WQ_MEM_RECLAIM are meaningful)
* @args...: args for @fmt
*
* Allocate an ordered workqueue. An ordered workqueue executes at
* most one work item at any given time in the queued order. They are
* implemented as unbound workqueues with @max_active of one.
*
* RETURNS:
* Pointer to the allocated workqueue on success, %NULL on failure.
*/
#define alloc_ordered_workqueue(fmt, flags, args...) \
alloc_workqueue(fmt, WQ_UNBOUND | __WQ_ORDERED | (flags), 1, ##args)
#define create_workqueue(name) \
alloc_workqueue("%s", __WQ_LEGACY | WQ_MEM_RECLAIM, 1, (name))
#define create_freezable_workqueue(name) \
alloc_workqueue("%s", __WQ_LEGACY | WQ_FREEZABLE | WQ_UNBOUND | \
WQ_MEM_RECLAIM, 1, (name))
#define create_singlethread_workqueue(name) \
alloc_ordered_workqueue("%s", __WQ_LEGACY | WQ_MEM_RECLAIM, name)
v4.10 버전의 소스를 보니 create_singlethread_workqueue는 alloc_ordered_workqueue를 호출하는데, 주석을 보니 한번에 하나의 쓰레드만 호출된다고 써있네요.
ordered가 아닌 workqueue는 동시에 여러개의 쓰레드가 실행될 수 있습니다. 이전 work가 안끝났는데 또 work를 추가할 수 있고, WQ_UNBOUND플래그를 썼다면 여러개의 CPU에서 동시에 실행될 수 있는걸로 기억납니다.