Для статеров: я студент, который не был бакалавром CS, но перешел в магистратуру CS. Поэтому я приветствую любую помощь, которую кто-либо готов оказать.
Цель этого состояла в том, чтобы создать N потоков между 2-4, а затем, используя случайно сгенерированный массив символов нижнего регистра, сделать их прописными.
Это нужно было сделать, используя N потоков (определяемых командной строкой при выполнении), разделив работу как можно более равномерно, используя pthread.
Мой главный вопрос, который я пытаюсь задать, заключается в том, избегал ли я условий гонки между своими потоками?
Я также изо всех сил пытаюсь понять разделение работы между потоками. Насколько я понимаю (поправьте меня, если я ошибаюсь), в общем случае функционирование потоков будет выбираться случайным образом во время выполнения. Итак, я предполагаю, что мне нужно сделать что-то вроде динамического разделения массива на N потоков и настроить его так, чтобы каждый поток выполнял верхний регистр части массива того же размера?
Я знаю, что, вероятно, есть ряд других несоответствий, которые мне нужно исправить в моем коде, но я не долго программировал и только начал использовать C/C++ около месяца назад.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#include <ctype.h>
//Global variable for threads
char randChars[60];
int j=0;
//Used to avoid race conditions
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
//Establish the threads
void* upperThread(void* argp)
{
while(randChars[j])
{
pthread_mutex_lock( &mutex1 );
putchar (toupper(randChars[j]));
j++;
pthread_mutex_unlock( &mutex1 );
}
return NULL;
}
int main(int argc, char **argv)
{
//Initializae variables and thread
int N,randNum,t;
long i;
pthread_t pth[N];
pthread_mutex_init(&mutex1, NULL);
char randChar = ' ';
//Check number of command inputs given
if(argc!=2)
{
fprintf(stderr,"usage: %s <enter a value for N>\n", argv[0]);
exit(0);
}
N = atoi(argv[1]);
//Checks command inputs for correct values
if(N<2||N>4){
printf("Please input a value between 2 and 4 for the number of threads.\n");
exit(0);
}
//Seed random to create a randomized value
srand(time(NULL));
printf("original lower case version:\n");
for (i=0; i<61; i++)
{
//Generate a random integer in lower alphabetical range
randNum = rand()%26;
randNum = randNum+97;
//Convert int to char and add to array
randChar = (char) randNum;
randChars[i] = randChar;
printf("%c", randChar);
}
//Create N threads
for (i=0; i<N; i++)
{
pthread_create(pth + i, NULL, upperThread, (void *)i);
}
printf("\n\nupper case version:\n");
//Join the threads
for(t=0; t < N; t++)
{
pthread_join(pth[t], NULL);
}
printf("\n");
pthread_exit(NULL);
return 0;
}