我只是使用C编程的初学者。对于我的大学项目,我想创建一个多线程服务器应用程序,多个客户端可以连接并传输可以保存在数据库中的数据。
经过许多教程后,我对如何使用pthread_create创建多个线程感到困惑。
它在某处完成了:
pthread_t thr;
pthread_create( &thr, NULL , connection_handler , (void*)&conn_desc);
在某处它就像
pthread_t thr[10];
pthread_create( thr[i++], NULL , connection_handler , (void*)&conn_desc);
我尝试在我的应用程序中实现这两个并且似乎工作正常。上述两种方法的哪种方法是正确的,我应该遵循。 对不起英语和描述不好。
答案 0 :(得分:2)
两者都是等价的。没有"对"或"错误"接近这里。
通常,在创建多个线程时会看到后者,因此使用了一组线程标识符(pthread_t
)。
在您的代码段中,两者都只创建一个线程。因此,如果您只想创建一个线程,则不需要数组。但这就像声明你没有使用的任何变量一样。它只是无害的。
事实上,如果您出于任何目的不需要线程ID(用于连接或更改属性等),则可以使用单个thread_t
变量创建多个线程,而无需使用数组。
以下
pthread_t thr;
size_t i;
for(i=0;i<10;i++) {
pthread_create( &thr, NULL , connection_handler , &conn_desc);
}
会工作得很好。请注意,转换为void*
是不必要的(pthread_create()
的最后一个参数)。任何数据指针都可以隐式转换为void *
。
答案 1 :(得分:0)
您提供的第一个创建了一个线程。
第二个(如果是循环的)有可能产生10个线程。
基本上pthread_t类型是线程的处理程序,所以如果你有10个数组,那么你可以有10个线程。
答案 2 :(得分:0)
多线程的示例示例:
#include<iostream>
#include<cstdlib>
#include<pthread.h>
using namespace std;
#define NUM_THREADS 5
struct thread_data
{
int thread_id;
char *message;
};
void *PrintHello(void *threadarg)
{
struct thread_data *my_data;
my_data = (struct thread_data *) threadarg;
cout << "Thread ID : " << my_data->thread_id ;
cout << " Message : " << my_data->message << endl;
pthread_exit(NULL);
}
int main ()
{
pthread_t threads[NUM_THREADS];
struct thread_data td[NUM_THREADS];
int rc, i;
for( i=0; i < NUM_THREADS; i++ )
{
cout <<"main() : creating thread, " << i << endl;
td[i].thread_id = i;
td[i].message = "This is message";
rc = pthread_create(&threads[i], NULL,
PrintHello, (void *)&td[i]);
if (rc){
cout << "Error:unable to create thread," << rc << endl;
exit(-1);
}
}
pthread_exit(NULL);
}