Многопоточность с использованием p thread Проблема Linux

У меня есть две функции: производитель и потребитель, вызываемые двумя потоками p, но цикл while в функции не выполняется. Это система Linux RT. это мой код. Я кодирую в eclipse.

#include <stdio.h>
#include"NIDAQmx.h"
#include <pthread.h>
#include "sts_queue/s_q.c"
#include <stdlib.h>

void *producer(void *ptr);// first function
void *consumer(void *ptr);// second function

TaskHandle taskHandle = 0;
int ret = 0;
int numChannels = 0;
int numRead;
float64 data[100];
int iret1, iret2;
pthread_t thread1, thread2;

int main(void) {
char *message1 = "Producer ended";
char *message2 = "consumer ended";
    init();
ret = DAQmxCreateTask("task", &taskHandle);

ret=DAQmxCreateAIVoltageChan(taskHandle, "PXI1Slot2/ai0", "",
        DAQmx_Val_Cfg_Default, -5, 5, DAQmx_Val_Volts, NULL);

ret=DAQmxCfgSampClkTiming(taskHandle, "", 1000, DAQmx_Val_Rising,DAQmx_Val_ContSamps, 100);

ret=DAQmxGetTaskAttribute(taskHandle, DAQmx_Task_NumChans, &numChannels);


ret=DAQmxStartTask(taskHandle);

iret1 = pthread_create(&thread1, NULL, producer,(void*) message1);// calling two threads
iret2 = pthread_create(&thread2, NULL, consumer,(void*) message2);// calling thread



}

void *producer(void *ptr) // enque function
{
char *message;
int i = 0;
int ret;
message = (char *) ptr;
while(i<1000)
{
//ret=DAQmxReadAnalogF64(taskHandle, 100, 10.0, DAQmx_Val_GroupByChannel, data,100 * numChannels, &numRead, NULL);
printf("task handle=%d\n",taskHandle);
printf("value of i=%d\n",i);
printf("Number of sample read%d\n",numRead);
printf("ret%d\n",ret);
sleep(.1);
i++;
}
ret=DAQmxStopTask(taskHandle);

ret=DAQmxClearTask(taskHandle);

printf("%s \n", message);
pthread_join(thread1, NULL);
return 0;
}

void *consumer(void *ptr) // deque function
{
char *message;
int k = 0;
int elements=0;
message = (char *) ptr;
while(k<1000)
{

    printf("value ofk=%d\n",k);
    sleep(.1);
    k++;
}
printf("%s \n", message);
pthread_join(thread2, NULL);

 }

Должен ли я использовать pthread_exit или pthread-join? как использовать pthead_exit для выхода из первого потока, когда цикл while вышел?

теперь моя консоль печатает только это

task handle=-163491360
start0
value ofk=0
task handle=-163491360
value of i=0
Number of sample read0
ret0
logout

но на самом деле значение i и k должно стать 1000, а когда оно достигнет 1000, цикл while остановится и выйдет

Иногда я тоже получаю эту ошибку

pure virtual method called
terminate called without an active exception
Aborted
logout

person Altris    schedule 23.07.2020    source источник


Ответы (1)


Вам нужно вызвать pthread_join в функции main после создания thread1 и thread2. В противном случае основной поток завершится до завершения потоков 1 и 2.

person tomptz    schedule 23.07.2020
comment
я должен использовать pthread_join или pthread_exit? за выход из этой темы? и должен ли мой void main() иметь цикл while, чтобы он оставался активным до выхода моего потока? - person Altris; 23.07.2020
comment
Вы должны вызвать pthread_join из функции main, чтобы дождаться завершения других потоков. Цикл while в main не требуется, так как pthread_join гарантирует, что основной поток остается активным до завершения других. - person tomptz; 23.07.2020
comment
Если вы вызовете pthread_exit в конце main, основной поток (и ваша программа) будут продолжать работать в фоновом режиме до тех пор, пока не завершатся все остальные потоки, но вы не увидите вывод. См. stackoverflow.com/a/3559873/4865273. - person tomptz; 23.07.2020
comment
Выделенные ресурсы будут освобождены, когда pthread_join вернется, потому что это означает, что потоки были уничтожены. - person tomptz; 23.07.2020
comment
@tomptz нет, ресурсы, такие как динамически выделяемая память, НЕ будут уничтожены при выходе из потока, если только этот поток не будет последним в процессе (и тогда ОС удаляет все, что не используется совместно с другим процессом). - person Martin James; 23.07.2020
comment
Действительно, но в этом случае за возвратом из вызовов pthread_join сразу последует выход из основного процесса в любом случае. - person tomptz; 23.07.2020