`

linux 线程挂起恢复的简单示例

 
阅读更多
转自
http://blog.csdn.net/honghuzhilangzixin/article/details/7908236


参考:

http://blog.csdn.net/chennxi/article/details/6234529《Linux下线程的挂起和恢复》

写了个demo:
#include <unistd.h>
#include <pthread.h>

static pthread_mutex_t mutex;
static pthread_cond_t cond;
static int flag = 0;

void srpthread_init()
{
	pthread_mutex_init(&mutex,NULL);
	pthread_cond_init(&cond,NULL);
}

void srpthread_suspend()
{
	pthread_mutex_lock(&mutex);
	flag--;
	pthread_mutex_unlock(&mutex);
}


void srpthread_resume()
{
	pthread_mutex_lock(&mutex);
	flag++;
	pthread_cond_signal(&cond);
	pthread_mutex_unlock(&mutex);
}

void *thread_run()
{
	while(1)
	{
		pthread_mutex_lock(&mutex);
		while(flag<=0)
		{
			pthread_cond_wait(&cond,&mutex);
		}

		pthread_mutex_unlock(&mutex);

		//actual work
		printf("i am running!\n");
	}

}

int main(int argc,char *argv[])
{
	char ch;
	pthread_t p1;
	srpthread_init();
	pthread_create(&p1,NULL,(void *)thread_run,NULL);

	while(1)
	{
		scanf("%c",&ch);
		switch(ch)
		{
			case 's':
				srpthread_suspend();
				break;
			case 'r':
				srpthread_resume();
				break;
			default:
				break;
		}
	}
#if 0
	printf("1111\n");
	srpthread_resume();
	printf("2222\n");
	sleep(3);
	printf("3333\n");
	srpthread_suspend();
	printf("4444\n");
#endif
	return 1;
}



编译命令:
gcc file.c -o file lpthread
分享到:
评论

相关推荐

    linux线程的挂起与恢复

    在提供的代码示例中,线程挂起通过共享变量`wqy_pthread_pause`、互斥锁`wqy_mutex_pause`和条件变量`wqy_cond_pause`实现。`wqy_pthread_suspend`函数用于挂起线程。首先,它检查`wqy_pthread_pause`的值,如果为`...

    linux多线程编程.doc

    `pthread_join()`是一个阻塞函数,它会挂起调用线程直到指定的线程结束。这有助于确保主函数不会在子线程完成之前退出。 关于线程相关的函数: 1. `pthread_t`:线程ID类型,表示一个线程的唯一标识。 2. `pthread...

    linux多线程编程_吸烟者问题

    条件变量允许线程在满足特定条件时挂起,直到其他线程改变条件使其恢复运行。 以下是一个简单的示例: 1. 定义资源(烟、火柴、报纸)和一个表示资源是否可用的布尔标志。 2. 使用互斥锁保护资源和标志,确保在...

    linux下 多线程模拟进程调度多线程模拟进程调度

    3. **线程条件变量**:条件变量(`pthread_cond_t`)允许线程在满足特定条件时挂起执行,等待其他线程改变条件。`pthread_cond_wait()`使线程等待,而`pthread_cond_signal()`或`pthread_cond_broadcast()`可以唤醒...

    Linux下多线程的阻塞模式下的socket编程

    5. **读写数据**:在阻塞模式下,recv()和send()函数会在没有数据可读或写入时挂起,直到数据可用。这样确保了数据的完整性和顺序。 6. **关闭资源**:处理完客户端的请求后,线程应关闭与客户端的连接(close())...

    Linux多线程之条件阻塞代码

    `pthread_cond_wait()`函数使当前线程挂起,释放互斥锁,并等待特定条件变为真。而`pthread_cond_signal()`函数则用来唤醒一个或多个等待在特定条件变量上的线程。 3. **条件阻塞** 在多线程环境中,如果线程A需要...

    Linux线程同步:深入理解与实践.pdf

    ### Linux线程同步:深入理解与实践 #### 1. 线程同步的重要性 在多线程编程中,线程同步是一项至关重要的技术。它确保了多个线程能够协调一致地访问共享资源,避免了数据竞争和其他并发问题的发生。没有适当的...

    多线程程序设计forLinux.pdf

    它允许主调线程合并指定线程,这样主调线程将挂起执行,直到指定线程终止。 `pthread_exit`函数用于线程终止自身,该函数有一个参数,类型为void*,用于传递返回状态。通常,线程函数的最后会调用`pthread_exit`...

    Linux多线程之同步.docx

    这个函数会先释放互斥锁,然后挂起当前线程。只有在其他线程对条件变量发出信号或广播后,该线程才能重新获得锁并被唤醒。 ```c pthread_cond_wait(cond_pro, mutex); ``` - **激发(pthread_cond_broadcast() ...

    高效linux的多线程编程经验12条总结

    通常先锁定互斥锁,然后检查条件是否满足,如果不满足则调用`pthread_cond_wait()`挂起当前线程并释放互斥锁,待条件满足后重新获取互斥锁继续执行。 3. **避免竞态条件** - **定义**:竞态条件是指两个或多个...

    qt3.rar_Linux QT_qt3 多线程_qt多线程

    确保你的代码能正确处理可能的异常情况,避免线程崩溃导致整个程序挂起。 压缩包中的"qt3"文件可能包含了源代码示例、文档或者其他辅助资源,帮助学习者理解如何在Linux环境下使用Qt3进行多线程编程。通过研究这些...

    C语言多线程

    - **线程挂起**: - 函数原型: `int pthread_join(pthread_t thread, void **value_ptr);` - 参数说明: - `thread`: 等待退出的线程ID。 - `value_ptr`: 存储退出线程的返回值。 - **线程退出**: - 函数原型: `...

    头歌Linux系统编程之c编程入门

    8. **Linux线程管理**:讲解如何在Linux中创建、挂起、终止线程,以及使用互斥锁、自旋锁、条件变量进行线程同步,确保并发执行的安全性。 9. **Linux网络编程**:分为TCP和UDP两部分,包括套接字创建、端口绑定、...

    完整版多线程模块.rar

    3. **线程状态**:线程有多种状态,如新建、就绪、运行、等待、挂起和终止。理解这些状态转换对调试和优化线程行为至关重要。 4. **并发与并行**:并发是指在一段时间内交替执行多个任务,而并行是在同一时刻执行多...

    pthread(arm_linux).zip_ARM Linux_arm_arm linux pthread_arm pthre

    2. 条件变量:允许线程在满足特定条件时挂起,当条件满足时由其他线程唤醒。常用函数有`pthread_cond_init()`、`pthread_cond_wait()`和`pthread_cond_signal()`。 3. 信号量:一种计数型同步机制,可以实现线程间...

    线程调度的优先级

    这是因为Java线程调度采用了非确定性的抢占式调度策略,即使优先级较高的线程也可能因为其他原因(如线程休眠、同步锁等)被暂时挂起,让其他线程有机会执行。 Java线程的优先级分为三个级别: 1. **NORM_PRIORITY*...

    互斥锁示例代码

    当线程请求一个已经锁定的互斥锁时,它会被挂起并放入等待队列中,直到锁被解锁。一旦锁变为未锁定状态,一个等待的线程会被唤醒,并获取锁,然后继续执行。如果多个线程同时请求一个未锁定的锁,只有一个会成功,...

    Linux线程退出方式总结(推荐)

    反之,如果处于`PTHREAD_CANCEL_DISABLE`状态,取消请求会被挂起,直到线程状态变为可取消。 - **可取消类型**:分为`PTHREAD_CANCEL_DEFERRED`和`PTHREAD_CANCEL_ASYNCHRONOUS`。`PTHREAD_CANCEL_DEFERRED`意味着...

    Linux程序设计(源码)

    4. **信号处理**:通过`signal`或`sigaction`函数,程序可以捕获并处理系统发送的各种信号,源码可能包含信号处理的实例,如中断、退出、挂起等。 5. **网络编程**:Linux提供了丰富的socket API,用于实现网络通信...

    linux任务和信号量的使用

    其他试图访问该资源的任务如果发现信号量为0,则会被挂起,直到持有资源的任务完成并调用`sem_v()`恢复信号量计数。这种机制确保了在同一时刻只有一个任务能访问共享资源。 同时,信号量还能实现简单的进程间通信...

Global site tag (gtag.js) - Google Analytics