2017-01-18 4 views
0
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include<signal.h> 
#include<unistd.h>//getch(); 
#include <termios.h>//getch(); 
#include <pthread.h> 
#include <unistd.h> 
unsigned int sleep(unsigned int seconds); 

volatile sig_atomic_t flag = 0; 
int value = 0; 
int count = 0; 

char getch() 
{ 
    int buf = 0; 
    struct termios old = { 0 }; 
    fflush(stdout); 
    if (tcgetattr(0, &old) < 0) 
     perror("tcsetattr()"); 
    old.c_lflag &= ~ICANON; 
    old.c_lflag &= ~ECHO; 
    old.c_cc[VMIN] = 1; 
    old.c_cc[VTIME] = 0; 
    if (tcsetattr(0, TCSANOW, &old) < 0) 
     perror("tcsetattr ICANON"); 
    if (read(0, &buf, 1) < 0) 
     perror("read()"); 
    old.c_lflag |= ICANON; 
    old.c_lflag |= ECHO; 
    if (tcsetattr(0, TCSADRAIN, &old) < 0) 
     perror("tcsetattr ~ICANON"); 

    return buf; 
} 
void *send_function(void *parg) 
{ 
    printf("\n Send Thread "); 
    count++; 
    return parg; 
} 
void *receive_function(void *parg) 
{ 
    printf("\n Receive Thread "); 
    count++; 
    return parg; 
} 
void my_function(int sig) 
{ 
    flag = 1; // set flag 
} 

int main() 
{ 
    char selection; //user input(s or r) 
    pthread_t send; 
    pthread_t receive; 
    while (1) 
    { 
     signal(SIGINT, my_function); 
     if (flag) 
     { 
      printf("\n Choose your terminal S or R \n"); 
      selection = getch(); 
      flag = 0; 
     } 
     if (selection == 's') 
     { 
      if (pthread_create(&send, NULL, send_function, NULL)) 
      { 
       printf("Error creating thread=%d\n", count); 
       return 1; 
      } 
     } 
     else if (selection == 'r') 
     { 
      if (pthread_create(&receive, NULL, receive_function, NULL)) 
      { 
       printf("Error creating thread=%d\n", count); 
       return 1; 
      } 
     } 

     printf("\n MAIN LOOP\n"); 
     //sleep(1); 
    } 
    return 0; 
    //pthread_exit(NULL); 
} 

Выход1:Бесконечный нагрузочный цикл в Pthread

MAIN LOOP 

Receive Thread 
MAIN LOOP 

Receive Thread 
MAIN LOOP 

Receive Thread 
MAIN LOOP 

Receive Thread 
Receive Thread 
Receive Thread 
Receive Thread Error creating thread=380 
[email protected]:~/C_sample$ 

выход2:

MAIN LOOP 

MAIN LOOP 

MAIN LOOP 

Send Thread 
Send Thread 
Send Thread 
Send Thread 
Send Thread 
MAIN LOOP 
Error creating thread=379 

В приведенном выше коде. код должен работать бесконечно, когда я нажимаю 's' или 'r', он должен печатать «отправить поток» или «получать поток» соответственно бесконечно много раз, тогда как в этом коде примерно 380 раз работает только цикл while. я знаю, почему это происходит. Я использовал подсчет переменных для цели отладки, может ли кто-нибудь помочь?

+0

Значит, вы создаете бесконечные потоки? Threads - это * конечный * ресурс, операционная система не позволит вам создавать бесконечное количество потоков. Вам также нужно подумать о том, как многозадачность работает в операционных системах, где все потоки и процессы * чередуются * для запуска на ядрах CPU. Чем больше потоков у вас есть, тем меньше времени на выполнение каждого из них, и тем больше времени, которое операционная система должна переключаться между ними. –

+1

Если только в документации для [pthread_create] (http://man7.org/linux/man-pages/man3/pthread_create.3.html#ERRORS) объясняется, при каких условиях она будет возвращать ошибку, как определить, какая ошибка есть и что может вызвать это. Это будет действительно набухать, не так ли? –

+0

Это номер, который ваш код выбрал для регистрации только по причинам, которые вы могли бы знать. Если вы не считаете это полезным, не регистрируйте его. –

ответ

1

Вам необходимо либо detach свои темы, либо join им. В противном случае у вас закончится нехватка ресурсов.

+0

да, это подойдет моему требованию @ Давид Шварц –