【问题标题】:Can a thread pool run on a single thread function?线程池可以在单线程函数上运行吗?
【发布时间】:2017-08-02 13:21:38
【问题描述】:

线程池是否可以在没有互斥锁的情况下在单线程函数上运行?

类似于以下内容。

void* thread_func( void* p ) {
}

for( int i = 0 ; i < N ; i++ ) }
    pthread_create( &t_id, &attr, thread_func, null );
}

或者我应该传递每个pthread_create 它自己的线程函数吗?

【问题讨论】:

  • 我不确定您的确切意思,但是如果您打算在池中的所有线程上运行相同的功能,这取决于您是否正在访问共享资源 e。 G。柜台或类似物品。
  • @marcusshep 请不要对随机短语使用代码格式,仅对代码和变量/函数名称使用。
  • 您可以将同一个线程函数用于多个线程。如果您正在访问正在修改的共享数据,那么您可能需要一个互斥锁。
  • @interjay 反应很好!
  • 实际上常见在多个线程中同时运行同一个线程函数,但这与您是否需要互斥锁或其他同步辅助无关。即使在各个线程中调用的函数之间没有重叠,您也需要通过互斥锁或类似方式保护对共享数据的访问。

标签: c pthreads


【解决方案1】:

线程池是否可以在没有互斥锁的情况下运行在单线程函数上?

是的,这是可能的。但这取决于您的 thread_func 函数。如果您正在访问一个共享资源,例如一个计数器并且您不使用互斥锁,那么您可能会遇到 race-condition:

int counter; // set to 2 in main function

void* thread_func(void *p) {
    counter = counter + 1;
}
  • 线程 A 从计数器读取(值:2)
  • 线程 B 从计数器读取(值:2)
  • 线程 B 增加计数器(值:3)
  • 线程 A 增加计数器(值:3)

发生这种情况是因为线程 A 的计数器值仍然为 2,并且添加 1 会导致(再次)为 3,即使根据正常理解,在两个线程完成增加值后计数器值应该是 4。

如果添加互斥体,线程必须等待当前修改计数器值的另一个线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 2019-08-06
    • 2010-10-10
    • 1970-01-01
    • 2018-09-20
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多