【发布时间】:2018-06-12 13:45:31
【问题描述】:
据我所知,突然创建和终止线程
每次都使用 pthread_kill() 不是一个好方法,所以我要去
使用 thread1.suspend() 和线程的挂起和恢复方法
thread1.resume(),随时需要。如何做/实现这个?
以下 LED 闪烁代码供参考。在thread1.start() 期间,使用suspended = false; 创建线程正在继续,因为它卡在了一个while 循环中。
调用thread1.suspend()没有效果。
#define on 1
#define off 0
void gpio_write(int fd, int value);
void* led_Flash(void* args);
class PThread {
public:
pthread_t threadID;
bool suspended;
int fd;
pthread_mutex_t m_SuspendMutex;
pthread_cond_t m_ResumeCond;
void start() {
suspended = false;
pthread_create(&threadID, NULL, led_Flash, (void*)this );
}
PThread(int fd1) { this->fd=fd1; }
~PThread() { }
void suspend() {
pthread_mutex_lock(&m_SuspendMutex);
suspended = true;
printf("suspended\n");
do {
pthread_cond_wait(&m_ResumeCond, &m_SuspendMutex);
} while (suspended);
pthread_mutex_unlock(&m_SuspendMutex);
}
void resume() {
/* The shared state 'suspended' must be updated with the mutex held. */
pthread_mutex_lock(&m_SuspendMutex);
suspended = false;
printf("Resumed\n");
pthread_cond_signal(&m_ResumeCond);
pthread_mutex_unlock(&m_SuspendMutex);
}
};
void* led_Flash(void* args)
{
PThread* pt= (PThread*) args;
int ret=0;
int fd= pt->fd;
while(pt->suspended == false)
{
gpio_write(fd,on);
usleep(1);
gpio_write(fd,off);
usleep(1);
}
return NULL;
}
int main()
{
int fd1=1,fd2=2, fd3=3;
class PThread redLED(fd1);
class PThread amberLED(fd2);
class PThread greenLED(fd3);
redLED.start();
amberLED.start();
greenLED.start();
sleep(1);
redLED.suspend();
return 0;
}
有人能帮帮我吗?
【问题讨论】:
-
杀死/暂停/恢复所有坏的。尽量不要从用户代码中做任何这些事情。尽量安排线程被创建的唯一时间是在进程启动时,线程被杀死的唯一时间是进程终止。
-
pt->suspended 既不是易失的也不是原子的。所以我的猜测是编译器将
while(pt->suspended == false) {...}优化为if (pt->suspended == false) { again: ...; goto again; }。如果变量是从信号处理程序更改的,那么 Volatile 将是正确的。对于多线程,最好使用 atomic。 -
"调用 thread1.suspend() 无效。"通过阅读代码,我希望红色 LED 继续闪烁(参见前面的评论),并且主线程只是卡在那里等待恢复条件。那是对的吗?您是希望挂起阻塞主线程还是希望 led_Flash 停止直到恢复?目前 led_Flash 将简单地退出线程,如果它看到
pt->suspended == true,就没有任何东西可以恢复。 -
您可以用单个 POSIX
sem_t替换您的pthread_mutex_t和pthread_cond_t。然后你的suspend()变成一个简单的sem_wait(),而resume()是一个sem_post()。因为你真正在做的只是阻塞。 -
该代码本质上是 C++ 代码,因为
class PThread { … };及其内容不是有效的 C。我已适当地重新标记和重新命名。
标签: c++ multithreading pthreads resume