2016-01-28 3 views
4

Я просто новичок в программировании, используя C. Для моего проекта колледжа Я хочу создать многопоточное серверное приложение, к которому несколько клиентов могут подключаться и передавать туда данные, которые могут быть сохранены в базе данных.Создание нескольких потоков в C

Пройдя много уроков, я смутился о том, как создавать несколько потоков, используя pthread_create.

Где-то это было сделано, как:

pthread_t thr; 

pthread_create(&thr, NULL , connection_handler , (void*)&conn_desc); 

и где это было как

Я попытался путем внедрения как в моем приложении и, кажется, работает хорошо. Какой подход из этих двух правил правильный, и я должен следовать. извините за плохой английский и описание.

+2

Оба из них используют один и тот же метод pthread_create, так что в некотором смысле они делают то же самое. Помимо этого, вопрос о том, как хранить ручку pthread (типа pthread_t), является вопросом выбора. Второй, похоже, хранит не более десяти потоков, а первый - только один поток. –

+3

Второй с 'thr [i ++]' должен быть '& thr [i ++]'. –

+0

@ Selçuk Cihan Если я что-то вроде для (i = 0; i <10; i ++) pthread_create (& thr, NULL, connection_handler, & conn_desc); Тогда он также создаст 10 потоков? – Ramanujam

ответ

2

Оба эквивалентны. Здесь нет «правильного» или «неправильного» подхода.

Как правило, вы можете увидеть позже при создании нескольких потоков, поэтому используется массив идентификаторов потоков (pthread_t).

В своих фрагментах кода создается только один поток. Поэтому, если вы хотите создать только один поток, вам не нужен массив. Но это так же, как объявление любых переменных (-ов), которые вы не использовали. Это просто безвредно.

Фактически, если вам не нужен идентификатор потока для любых целей (для присоединения или изменения атрибутов и т. Д.), Вы можете создать несколько потоков, используя одну переменную 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 *.

+0

@ I3x, если мне нужно создать 100 потоков, тогда мне нужно следовать второму подходу с помощью pthread_t thr [100] или первый подход также решит мою проблему. – Ramanujam

+0

Даже если вы хотите создать 100 потоков, вам все равно не требуется использовать массив ('pthread_t thr [100]'). Вам нужно только сохранить идентификаторы, если вы хотите что-то с ними сделать позже. Так что это зависит от вашего приложения. См. Обновление. –

+0

@ Ramanujam - будет проще использовать 'pthread_t thr [100]', особенно если вы хотите, чтобы все 100 потоков делали то же самое. В противном случае вам потребуется 100 переменных для отслеживания дескрипторов 'pthread_t'. –

0

Первый, который вы предоставили, создает один поток.

Второй (если он зациклен) способен порождать 10 потоков.

В принципе, тип pthread_t является обработчиком потока, поэтому, если у вас есть массив из 10 из них, вы можете иметь 10 потоков.

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);  
} 
Смежные вопросы