Следующий код запускает несколько потоков, и если поток уже запущен с тем же идентификатором, он отменяет предыдущий поток. Я использую этот код, чтобы перезапустить таймер для света.
Моя проблема в том, как повторно использовать параметры потока дважды? Я должен выделить память для структуры "thread_data" перед повторным использованием и перед повторным созданием потока... Это можно сделать с помощью карты "thread_list"? Может быть, я задаю не тот вопрос... Однако я уверен, что правильно ответил
#include <iostream>
#include <pthread.h>
#include <sched.h>
#include <signal.h>
#include <unistd.h>
#include <map>
using namespace std;
pthread_mutex_t mutex_t;
map <string, pthread_t> thread_list;
struct thread_data
{
char *num;
char *type;
int time;
};
static void cleanup(void *arg)
{
pthread_mutex_lock(&mutex_t);
cout << "Thread Cleaned" << endl;
pthread_mutex_unlock(&mutex_t);
}
static void *thread(void *arg)
{
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);
pthread_cleanup_push(&cleanup,NULL);
thread_data* my_data = (thread_data*)(arg);
int time = my_data->time;
pthread_mutex_lock(&mutex_t);
cout << "Thread start " << time << " " << my_data->num << endl << flush;
pthread_mutex_unlock(&mutex_t);
while(time)
{
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_testcancel();
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
sched_yield();
pthread_mutex_lock(&mutex_t);
sleep(1);
time--;
pthread_mutex_unlock(&mutex_t);
}
pthread_mutex_lock(&mutex_t);
cout << "Thread End " << endl;
pthread_mutex_unlock(&mutex_t);
pthread_cleanup_pop(0);
return NULL;
}
void interrupt(string num, int time = 0, string type = "")
{
cout << "Interruptable " << num << " " << time << " " << type << endl;
if (thread_list.find(num)->second)
{
cout << "Cancel " << num << endl;
if (pthread_cancel(thread_list[num]) == 0)
{
pthread_detach(thread_list[num]);
while (pthread_kill(thread_list[num], 0)==0)
sched_yield();
}
thread_list.erase(num);
}
thread_data td;
td.time = time;
td.num = "Ok";
pthread_t thread_id;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_mutex_init(&mutex_t, NULL);
pthread_create (&thread_id, &attr, &(thread), (void *)&td);
thread_list.insert(pair <string, pthread_t> (num, thread_id));
}
int main()
{
cout << "Start main" << endl;
interrupt("6335", 5, "");
sleep(1);
interrupt("6335", 2, "");
sleep(6);
cout << "End main" << endl;
return 0;
}