#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. я знаю, почему это происходит. Я использовал подсчет переменных для цели отладки, может ли кто-нибудь помочь?
Значит, вы создаете бесконечные потоки? Threads - это * конечный * ресурс, операционная система не позволит вам создавать бесконечное количество потоков. Вам также нужно подумать о том, как многозадачность работает в операционных системах, где все потоки и процессы * чередуются * для запуска на ядрах CPU. Чем больше потоков у вас есть, тем меньше времени на выполнение каждого из них, и тем больше времени, которое операционная система должна переключаться между ними. –
Если только в документации для [pthread_create] (http://man7.org/linux/man-pages/man3/pthread_create.3.html#ERRORS) объясняется, при каких условиях она будет возвращать ошибку, как определить, какая ошибка есть и что может вызвать это. Это будет действительно набухать, не так ли? –
Это номер, который ваш код выбрал для регистрации только по причинам, которые вы могли бы знать. Если вы не считаете это полезным, не регистрируйте его. –