Я новичок в темах в c. В моем коде есть поток, который увеличивает счетчик, и иногда (случайно) другой поток считывает этот счетчик. Я использовал мьютекс в этом коде, но мой код всегда дает мне значение, равное 1. Хотя я использовал pthread_mutex_unlock, но кажется, что значение становится заблокированным навсегда. что я должен сделать, чтобы решить проблему?
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <pthread.h>
///////////////////////////
long int count=0;
int RunFlag=0;
pthread_mutex_t mtx;
void *readfun(void *arg)
{
while (RunFlag==0)
{
pthread_mutex_lock(&mtx);
count=count+1;
pthread_mutex_unlock(&mtx);
}
}
void *printfun(void *arg)
{
int RadnTime=0;
for (int j=0;j<4;j++)
{
RadnTime=rand()%3+1;
sleep(RadnTime);
printf("The current counter after %d seconds is: ",RadnTime);
pthread_mutex_lock(&mtx);
printf("%d\n",count);
pthread_mutex_unlock(&mtx);
}
}
void main ()
{
pthread_t thread1;
pthread_t thread2;
pthread_mutex_init(&mtx, NULL);
pthread_create(&thread1,NULL,readfun,NULL);
pthread_create(&thread2,NULL,printfun,NULL);
//stop the counter
RunFlag=1;
pthread_exit(NULL);
}
RunFlag
не имеет значения, потому что нам все равно, пройдет ли поток чтения дальшеRunFlag == 0
после установки флага. Если он добавляется кcount
после того, как ему сказали остановиться, это не имеет большого значения. 13.12.2016pthread_join()
вообще не нужны. В файле main естьpthread_exit()
. Инициализация мьютекса в порядке, поскольку она выполняется с использованиемpthread_mutex_init()
. 13.12.2016PTHREAD_MUTEX_INITIALIZER
из твоего ответа! /// Вы уверены, что вызовpthread_exit(NULL);
в основном потоке будет ждать завершения других потоков? Это не ясно из документов. 13.12.2016