Попытка понять, как pthread работает в C

Я пытаюсь использовать pthread в C для сравнения двух строк. Идея состоит в том, чтобы увидеть, находится ли полная строка 2 в строке 1 (например, если string1 = lkajdsgl и string2 = jd, то у меня будет одно совпадение). Чего я не понимаю, так это того, как pthread работает в целом. Здесь я создаю свои потоки, предполагая NUM_THREADS=3, тогда у меня должно быть 3 потока: потоки [0], потоки [1] и потоки [2]. Каждый вызовет функцию Pthrd_Substring. Строки будут прочитаны из файла и проанализированы в функции. Однако я не понимаю, как использовать pthread_join. Если строка имеет длину 12 символов, а у меня есть только 3 потока, как система узнает, что нужно продолжать анализировать строку с 3 потоками, пока не будут проверены все 12 символов? (Функция просматривает каждую букву в строке 1 и сравнивает ее с первой буквой в строке 2, прежде чем определить, присутствует ли полная строка 2.)

int main(int argc, char *argv[])
{
    pthread_t threads[NUM_THREADS];
    int count, rc;
    long t;

    for(t=0;t<NUM_THREADS;t++){
     printf("In main: creating thread %ld\n", t);
     rc = pthread_create(&threads[t], NULL, Pthrd_Substring, (void *)t);
     if (rc){
       printf("ERROR; return code from pthread_create() is %d\n", rc);
       exit(-1);
       }
     }

    printf("The number of substrings is: %d\n", count);
    return 1;
}

Я могу использовать что-то вроде:

pthread_join(threads0, NULL);
 partial_sum += t.partial_count;
pthread_join(threads1, NULL);
 partial_sum += t.partial_count;
pthread_join(threads2, NULL);
 partial_sum += t.partial_count;

И есть глобальный итог в функции? Но проверяет ли это каким-то образом каждую букву в строке?


Я не решался включить эту часть, потому что я еще не все проработал, так как не понимаю, как именно работает вызов pthread в main. Однако это псевдокод, который у меня есть для функции, здесь n1 — длина строки string1, а n2 — длина string2:

void *Pthrd_Substring(void *thrdptr)
{
    int i,j,k;
    int count;
    int total = 0;

    for (i = thrdptr; i <= (n1-n2); i++){       
        count=0;
        for(j = i,k = 0; k < n2; j++,k++){  /*search for the next string of size of n2*/  
            if (*(s1+j)!=*(s2+k)){
                break;
            }
            else
                count++;
            if(count==n2)    
                total++;        /*find a substring in this step*/                          
        }
    }
    partial_count = total
}

person Joseph    schedule 24.04.2017    source источник
comment
Пожалуйста, покажите Pthrd_Substring. На самом деле, не забудьте предоставить минимально воспроизводимый пример.   -  person kaylum    schedule 24.04.2017
comment
Я надеюсь, что это обеспечивает необходимую информацию. Код не является «полным», потому что я не решил эту проблему.   -  person Joseph    schedule 24.04.2017
comment
Кто придумал использовать несколько потоков для поиска подстроки? Это настолько странная идея, насколько я могу придумать. Если это не садистский взгляд учителя на домашнее задание, вам следует избегать его выполнения. Ваша функция Pthrd_Substring() не компилируется корректно, как показано (i = thrdptr). Он использует глобальные переменные, которые вы не показали (n1, n2). У вас много серьезных проблем. Вы передаете указатель на t всем потокам, но не гарантируете, что каждый поток видит свои собственные данные. Вы понятия не имеете, что каждый поток использует в качестве значения.   -  person Jonathan Leffler    schedule 24.04.2017
comment
Под неполным вы подразумеваете не компилируется? Поскольку i — это int, thrdptr — это void* (таким образом, несоответствие типов), а источник n1, n2, s1, s2 и partial_count остается воображению.   -  person WhozCraig    schedule 24.04.2017
comment
Это то, что профессор заставляет меня ознакомиться с pthreads, что мне, очевидно, нужно, поскольку я упускаю здесь фундаментальный момент. Я не думаю, что сказал неполный, но да, я не опубликовал все это, потому что часть этого была представлена ​​​​в примере, и я просто хотел сосредоточиться на том, что я пишу. Я полагаю, я мог бы отредактировать всю программу до того, что является только моим?   -  person Joseph    schedule 24.04.2017
comment
не лучше ли было бы переписать этот код, чтобы свести к минимуму проблему, и опубликовать полный код?   -  person Joseph    schedule 24.04.2017
comment
Это едва ли не самое худшее упражнение из возможных. многопоточность, которую я когда-либо видел. Использование более чем одного потока для поиска строк тривиального размера не только крайне неуместно и неэффективно, но и попытка управлять поиском так, как вы описываете, кошмарна.   -  person ThingyWotsit    schedule 24.04.2017
comment
Если вы собираетесь это сделать, вычислите [количество потоков] начальные точки в массиве, примерно равные по размеру, и пусть три потока ищут начальный символ только в своем собственном разделе. Не заставляйте рабочие потоки читать файл — считывайте заполнение в массив и загружайте его в распределенную структуру вместе с началом/длиной для каждого потока и передайте адрес структуры в pthread_create(). Поместите результаты в структуру и «верните» структуру с помощью pthread_exit(). Бесплатно после pthread_join() и накопления результатов.   -  person ThingyWotsit    schedule 24.04.2017
comment
... или лучше использовать пул потоков, но, учитывая характер задания «термоядерная боеголовка, чтобы расколоть орех», просто сделайте это более простым способом и получите несколько оценок.   -  person ThingyWotsit    schedule 24.04.2017


Ответы (1)


Если строка имеет длину 12 символов, а у меня есть только 3 потока, как система узнает, что нужно продолжать анализировать строку с 3 потоками, пока не будут проверены все 12 символов?

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

Однако я не понимаю, как использовать pthread_join.

pthread_join просто ждет завершения потока. Это все.

person user253751    schedule 24.04.2017