Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 线程池能否在单个线程函数上运行?_C_Pthreads - Fatal编程技术网

C 线程池能否在单个线程函数上运行?

C 线程池能否在单个线程函数上运行?,c,pthreads,C,Pthreads,线程池是否可以在没有互斥锁的情况下在单个线程函数上运行 类似下面的内容 void* thread_func( void* p ) { } for( int i = 0 ; i < N ; i++ ) } pthread_create( &t_id, &attr, thread_func, null ); } void*thread\u func(void*p){ } 对于(int i=0;i

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

类似下面的内容

void* thread_func( void* p ) {
}

for( int i = 0 ; i < N ; i++ ) }
    pthread_create( &t_id, &attr, thread_func, null );
}
void*thread\u func(void*p){
}
对于(int i=0;i
或者我应该传递每个
pthread\u create
它自己的线程函数吗?

线程池可以在没有互斥锁的单线程函数上运行吗

是的,这是可能的。但这取决于
线程函数
函数。如果您正在访问共享资源,例如计数器,但不使用互斥锁,则可能会遇到争用情况:

  • 线程A从计数器读取(值:2)
  • 线程B从计数器读取(值:2)
  • 线程B增加计数器(值:3)
  • 线程A增加计数器(值:3)
发生这种情况的原因是线程A的计数器值仍然为2,并且加上1,结果是3(同样),即使按照正常理解,在两个线程完成增加值之后,计数器值应该是4

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

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

是的,这是可能的。但这取决于
线程函数
函数。如果您正在访问共享资源,例如计数器,但不使用互斥锁,则可能会遇到争用情况:

  • 线程A从计数器读取(值:2)
  • 线程B从计数器读取(值:2)
  • 线程B增加计数器(值:3)
  • 线程A增加计数器(值:3)
发生这种情况的原因是线程A的计数器值仍然为2,并且加上1,结果是3(同样),即使按照正常理解,在两个线程完成增加值之后,计数器值应该是4


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

我不确定您的确切意思,但如果您打算在池中的所有线程上运行相同的函数,这取决于您是否正在访问共享资源。G计数器或类似工具。@marcusshep请不要对随机短语使用代码格式,只对代码和变量/函数名使用。您可以对多个线程使用同一线程函数。如果您正在访问正在修改的共享数据,那么您可能需要一个互斥锁。@interjay响应得很好!事实上,在多个线程中并发运行同一个线程函数是很常见的,但这与是否需要互斥或其他同步辅助无关。即使在不同线程中调用的函数之间没有重叠,您也需要通过互斥或类似方式保护对共享数据的访问。我不确定您的确切意思,但如果您打算在池中的所有线程上运行相同的函数,这取决于您是否正在访问共享资源。G计数器或类似工具。@marcusshep请不要对随机短语使用代码格式,只对代码和变量/函数名使用。您可以对多个线程使用同一线程函数。如果您正在访问正在修改的共享数据,那么您可能需要一个互斥锁。@interjay响应得很好!事实上,在多个线程中并发运行同一个线程函数是很常见的,但这与是否需要互斥或其他同步辅助无关。即使在不同线程中调用的函数之间没有重叠,也需要通过互斥或类似方式保护对共享数据的访问。
int counter; // set to 2 in main function

void* thread_func(void *p) {
    counter = counter + 1;
}