У вас есть pthread, который спит, ожидая переменную условия. Я использую логическое значение во внешнем цикле, чтобы он работал. Проблема, которая, как мне кажется, заключается в изменении этой переменной, поток не умирает.
Я взглянул на инструменты, и если я начну нить, скажи ей, чтобы умереть, тогда запустите новый, мой счетчик потоков - 2, а не 1.
Как я могу правильно уничтожить этот поток, когда захочу?
int worktodo=0;
BOOL runthread=NO;
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
void *threadfunc(void *parm)
{
int rc;
while(runthread==YES)
{
rc=pthread_mutex_lock(&mutex);
while(!worktodo)
{
printf("thtread blocked\n");
rc=pthread_cond_wait(&cond, &mutex);
}
printf("thtread awake.... doing work\n");
//doing work
worktodo=0;
rc=pthread_mutex_unlock(&mutex);
}
//never reaches here!!
pthread_detach(NULL);
}
void makeThread()
{
pthread_attr_t attr;
int returnVal;
returnVal = pthread_attr_init(&attr);
assert(!returnVal);
runthread=YES;
returnVal = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
assert(!returnVal);
int threadError = pthread_create(&str->thread, &attr, &threadfunc, NULL);
returnVal = pthread_attr_destroy(&attr);
assert(!returnVal);
if (threadError != 0)
{
//Report an error.
}
}
void wakethread()
{
pthread_mutex_lock(&mutex);
worktodo=1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
void killthread
{
runthread=NO;
}
титон был правильным. Я не смог убить нить, пока она была заблокирована. Возможно, лучший способ сделать это, но решение, которое сработало для меня, заключалось в том, чтобы установить runthread в false, а затем разбудить поток.
void killthread
{
runthread=NO;
pthread_mutex_lock(&mutex);
worktodo=1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
Вы инициализируете runthread равным NO и сравниваете его с YES. Нить никогда не должна проникать внутрь
while(runthread==YES)
петля. Кроме того, когда поток ждет работы, killthread не разбудит его, а runthread останется в рабочем цикле ожидания.