Моя программа состоит из нескольких потоков записи, которые записывают данные в буфер, и потока чтения, который считывает данные из этого общего буфера и выводит их. Мне нужно убедиться, что все потоки записи записали свои данные в буфер до того, как поток чтения попытается их прочитать. Моя интуиция подсказывает мне, что я бы реализовал это с помощью семафоров, но на самом деле они не имеют для меня особого смысла. Вот мои две функции:
void *search_thread_func(void *threadArgs)
{
printf("\n");
//pthread_mutex_lock(&mutex);
int count = 0;
int matches = 0;
int matches_this_line = 0;
int lines = 0;
int inputLines = 0;
int tid;
int *wbPtr;
//char *buffer;
char *sharedBuffer;
char *writeBuffer;
char* string;
string = ((struct st_args*)threadArgs)->string;
tid = ((struct st_args*)threadArgs)->threadId;
wbPtr = ((struct st_args*)threadArgs)->wBufPtr;
//buffer = ((struct st_args*)threadArgs)->threadBuffer;
sharedBuffer = ((struct st_args*)threadArgs)->sharedBuffer;
writeBuffer = ((struct st_args*)threadArgs)->writeBuffer;
//printf("Thread %d\n",(int)tid);
printf("Searching for %s\n", string);
//printf("%d\n", (int)sharedBuffer);
while(sharedBuffer[count] != NULL)
{
//printf("%c", sharedBuffer[count]);
count++;
if(sharedBuffer[count] == '\n')
{
inputLines++;
}
}
printf("\n");
//pthread_mutex_unlock(&mutex);
char *token;
char *temp = malloc(count*sizeof(char));
memcpy(temp, sharedBuffer, count);
token = strtok(temp, "\n");
while(token != NULL)
{
printf("%s\n", token);
char *q = strstr(token, string);
if(q != NULL)
{
matches_this_line++;
lines++;
for(char *r = q; r != NULL; r= strstr(r+strlen(string), string))
{
matches++;
}
pthread_mutex_lock(&mutex);
for(int j = 0; j < strlen(token); j++)
{
writeBuffer[*wbPtr] = token[j];
*wbPtr = *wbPtr + 1;
}
writeBuffer[*wbPtr] = '\n';
*wbPtr = *wbPtr + 1;
pthread_mutex_unlock(&mutex);
}
token = strtok(NULL, "\n");
}
printf("lines %d, matches %d\n", lines, matches);
printBuffer(writeBuffer, *wbPtr);
free(temp);
printf("\n");
}
void *write_thread_func(void *threadArgs)
{
printf("write func\n");
char *writeBuffer;
int * wbPtr;
FILE* wFP;
writeBuffer = ((struct wt_args*)threadArgs)->writeBuffer;
wFP = ((struct wt_args*)threadArgs)->wFP;
wbPtr = ((struct st_args*)threadArgs)->wBufPtr;
printf("wbPtr = %d\n", wbPtr);
printf("*wbPtr = %d\n", *wbPtr);
//printf("wb loc = %d\n", writeBuffer);
}
В основном потоки поиска просматривают одни данные и записывают другие данные в буфер. Я еще не реализовал чтение write_thread_func из буфера, но это довольно тривиально. Я понимаю, как работают блокировки мьютексов, но я не думаю, что это сработает здесь, потому что мне нужно убедиться, что write_thread_func выполняется последним или ждет, пока search_thread_funcs закончит запись в буфер.