Dies ist für eine Betriebssystem-Programmierzuordnung. Ich versuche zu lesen n Anzahl der Dateien, verwenden Sie Threads, um jede Datei nach einer Anzahl von Vorkommen für ein bestimmtes Zeichen zu suchen. alsSchließen von dynamisch erstellten Threads
./mycount j new.txt some.txt here.txt hello.txt
Der Ausgang für meinen Testcode sein soll:
argumentCount: 6
threadCount: 4
pthread_create() for thread 0 returns: 0
Thread 1
pthread_create() for thread 1 returns: 0
Thread 2
pthread_create() for thread 2 returns: 0
Thread 3
pthread_create() for thread 3 returns: 0
Thread 4
jedoch jede Ausführung der mycount verschieden ist, mit dem letzten Thread in der Regel nicht die Ausführung/Drucks. Entweder das oder sie werden sporadisch, im Tandem usw. drucken.
Ich versuche einen Mutex zu verwenden, um die Integrität meiner Daten zu gewährleisten, aber ich bin mir nicht sicher, was wirklich hinter den Kulissen passiert.
Wie stelle ich sicher, dass alles immer gleich abläuft? Der letzte Thread gibt immer 0 zurück, aber manchmal führt er die Funktion nicht vollständig aus.
Code:
//GLOBALS
int occurrences = 0;
//PROTOTYPES
void *scanFile(void *filePtr);
//Initialize space for mutex.
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//Receive arguments from .exe call
void main (int argumentCount, char *argumentVariables[])
{
//Exit if argumentCount is > 50.
if (argumentCount > 50)
{
perror("Too many arguments. Enter less than 50.\n");
exit(EXIT_FAILURE);
}
printf("argumentCount: %d \n", argumentCount);
//Instantiate variables.
//i - iterator
//*newCommand - Used to hold string value of first command entered.
//*newVector - Used to hold string of the rest of the commands. Is a vector.
int i;
char *searchCharacter;
char *newVector[argumentCount];
//Iterate through command line arguments and split them.
for (i = 0; i < argumentCount; i++)
{
searchCharacter = argumentVariables[1];
if (i < argumentCount - 1)
{
newVector[i] = argumentVariables[1 + i];
}
else
{
newVector[i] = NULL;
}
}
//Exit if newest command is NULL.
if (searchCharacter == NULL)
{
perror("No character entered!\n");
exit(EXIT_FAILURE);
}
int threads = argumentCount - 2;
printf("threadCount: %d \n", threads);
pthread_t * thread = malloc(sizeof(pthread_t)*threads);
for (int i = 0; i < threads; i++)
{
int ret;
char *message = "Thread";
ret = pthread_create(&thread[i], NULL, scanFile, (void*) message);
if (ret != 0)
{
printf("Error - pthread_create() return code: %d\n", ret);
exit(EXIT_FAILURE);
}
printf("pthread_create() for thread %d returns: %d\n", i, ret);
}
exit(EXIT_SUCCESS);
}
void *scanFile(void *filePtr)
{
pthread_mutex_lock(&mutex);
char *message;
message = (char *) filePtr;
occurrences += 1;
printf("%s %d\n", message, occurrences);
pthread_mutex_unlock(&mutex);
}
Wo ist der Code, die * * schließt sich die Fäden? Warum ist das wichtig um sicherzustellen, dass "alle Threads starten und die Arbeit abschließen"? – user2864740
Ich bin mir nicht sicher, wie man ** n ** Threads beitreten kann. Außerdem ist es wichtig für mich sicherzustellen, dass alle ausgeführt werden, da ich in Zukunft jeden Thread brauche, um eine Datei nach einer Anzahl von Vorkommen eines bestimmten Zeichens zu durchsuchen. –
Siehe ["pthread join" (Web)] (https://www.google.com/search?q=pthread+join) und ["pthread join" (SO)] (https://stackoverflow.com/search ? q = Pthread + Join). – user2864740