QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2445|回复: 10

linux下怎么实现线程随时挂起.....

[复制链接]
发表于 2004-11-3 09:55:56 | 显示全部楼层 |阅读模式
我想一些时候, 挂某个线程pthread_t。
我的想法是
通过pthread_kill向pthread启发一个SIGHUP. 线程则会执行我设定的signal handler...handler里面我再去尝试lock一个mutex, 线程则被挂起.....直至我执行resume函数,将那个mutex启发。

关键是让我的signal handler如果得到那个pthread_mutex_t?


有没有更好的方法?
发表于 2004-11-3 10:46:17 | 显示全部楼层
不能将你的mutex设成全局吗?
回复

使用道具 举报

发表于 2004-11-3 21:49:33 | 显示全部楼层
mutex到底怎么init的啊,我编译是老说PHTREAD_MUTEX_INITIALIZER没定义.可是这个属性好象是可以直接用的啊。
回复

使用道具 举报

发表于 2004-11-4 01:19:38 | 显示全部楼层
#include <pthread.h>
pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;
回复

使用道具 举报

 楼主| 发表于 2004-11-4 09:18:49 | 显示全部楼层
是这样的....我想封装出一个线程类....
里面有
suspendthread和
resumethread方法....
如果是全局的话.....每个对象应该有一个全局的mutex...这个是不是.....

pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;
这个又是虾米意思?
回复

使用道具 举报

发表于 2004-11-4 12:18:36 | 显示全部楼层
[quote:3f4ef485a3="mozilla"]#include <pthread.h>
pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;[/quote]

是静态的建立mutex,能不能用pthread_mutex_init()建立呢.
老师让我们用mutex实现消费者和生产者的问题.定义一个buffer,然后一个thread往里面写东西,另个一thread读出来.
写的时候把mutex锁上,写完后解开.
然后读的thread根据mutex的状态,决定要不要读.
这样能实现吗?
回复

使用道具 举报

发表于 2004-11-4 13:30:04 | 显示全部楼层
可以用init建立,然后传递指针。但要保证只被初始化一次(可以使用pthread_once),且要用pthread_mutex_destroy销毁。。
楼上的问题就按教科书来就可以了,在一个线程代码中先判断互斥量(if ( pthread_mutex_lock(&mut)),能读就先锁住再读,然后解锁....
回复

使用道具 举报

发表于 2004-11-4 15:13:50 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<errno.h>

int buff[5];
void pro_th(void *arg);
void cus_th(void *arg);
pthread_mutex_t mutex;

int main(int argc,char argv[])
{
        pthread_t pro_th_id;
        pthread_t cus_th_id;
        int ret;
        //create threads
        ret=pthread_create(&pro_th_id,NULL,(void *)pro_th,NULL);
                if(ret!=0){
                perror("pthread_create:pro_th");
                exit(EXIT_FAILURE);
                }
        ret=pthread_create(&cus_th_id,NULL,(void *)cus_th,NULL);
                if(ret!=0){
                perror("pthread_create:cus_th");
                exit(EXIT_FAILURE);
                }
        //create mutex
        int mu;
        mu=pthread_mutex_init(&mutex,NULL);
        if(mu!=0){
                perror("pthread_mutex_init");
                exit(EXIT_FAILURE);
                }
               
        exit(EXIT_SUCCESS);
}

void pro_th(void *arg)
{        if(pthread_mutex_lock(&mutex)!=0){
                perror("pthread_mutex_lock");
                exit(EXIT_FAILURE);
                }
        int i;
        for(i=0;i<5;i++){
                buff=i;
                printf("pro_th put the produce into the buffer and sleep for 2s");
                sleep(2);
                }
        if(pthread_mutex_unlock(&mutex)!=0){
                perror("pthread_mutex_unlock");
                exit(EXIT_FAILURE);
                }
}


void cus_th(void *arg)
{        int ret;
        ret=pthread_mutex_trylock(&mutex);
        if(ret!=EBUSY){
                if(ret!=0){
                        perror("pthread_mutex_trylock");
                        exit(EXIT_FAILURE);
                        }
                printf("The muxte is unlock, cus_th will read form the buffer...\n");
                printf("The produce in buffer is:");
                int i;
                for(i=0;i<5;i++){
                        printf(" d%",buff);
                        }
                }else{
                printf("The mutex is locked,cus_th waiting for producing");
                }
}

用GCC编译时好象在连接时有错误.(gcc -o pro pro.c).
关键是现在看不懂出错信息是什么意思,本人接触linux下编程不久啦,请教高手.
回复

使用道具 举报

发表于 2004-11-4 16:15:47 | 显示全部楼层
加个 -lpthread。
你再把出错信息贴出来看看。
回复

使用道具 举报

 楼主| 发表于 2004-11-4 21:19:07 | 显示全部楼层
= =....怎么没人理我的问题了
回复

使用道具 举报

发表于 2004-11-4 22:17:29 | 显示全部楼层
[quote:409bcab734="释雪"]= =....怎么没人理我的问题了[/quote]信息淹没
PTHREAD_MUTEX_INITIALIZER是一个初始化mutex量的宏,在pthread.h中有,并且不用pthread_mutex_destroy销毁。
封装线程类可不是我所能解答的。建议你不要这样做,用线程类库(不是内裤)吧,比如ZThread等。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 03:28 , Processed in 0.064421 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表