免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1559 | 回复: 3
打印 上一主题 下一主题

临下班发个程序关于线程的条件变量的,欢迎拍砖 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-11 17:55 |只看该作者 |倒序浏览
//程序名: cond.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

static int s_arg[10];
static pthread_mutex_t s_mutex[10];
static pthread_cond_t s_cond[10];

void * fun(void *arg)
{
        int        i = *((int *)arg);
       
        pthread_detach(pthread_self());
        printf("pthread %d is run\r\n", i);
       
        for( ; ; ) {
                printf("wait signal for %d\r\n", i);
                pthread_cond_wait(s_cond + i, s_mutex +i);
                printf("recv signal %d OK\r\n", i);
        }

        pthread_exit(NULL);
}

int main(int argc, char *argv)
{
        int        i;
        int        count = 10;
        pthread_t        tid;
       
        //INIT
        for(i = 0; i < count; i++) {
                s_arg[i] = i;
                pthread_mutex_init(s_mutex + i, NULL);
                pthread_cond_init(s_cond + i, NULL);
        }

        //CREATE THREADS
        for(i = 0; i < count; i++) {
                pthread_create(&tid, NULL, fun, s_arg + i);
        }
       
        //
        usleep(100000);
       
        //
        pthread_cond_signal(s_cond + 5);
        pthread_cond_signal(s_cond + 0);
        sleep(2);

        return(0);
}

[[i] 本帖最后由 safedead 于 2009-2-11 17:59 编辑 [/i]]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2009-02-11 17:58 |只看该作者

回复 #1 safedead 的帖子

某次执行结果:
pthread 0 is run
wait signal for 0
pthread 3 is run
wait signal for 3
pthread 4 is run
wait signal for 4
pthread 5 is run
wait signal for 5
pthread 6 is run
wait signal for 6
pthread 7 is run
wait signal for 7
pthread 8 is run
wait signal for 8
pthread 9 is run
wait signal for 9
pthread 2 is run
wait signal for 2
pthread 1 is run
wait signal for 1
recv signal 5 OK
wait signal for 5
recv signal 0 OK
wait signal for 0

系统: CentOS 4.7 X86_64 SMP, 2个CPU

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2009-02-11 18:06 |只看该作者

回复 #1 safedead 的帖子

显然, 这个程序有某些麻烦
首先是pthread_create()的执行效果没有按照for(i =0 to 10)的顺序所期望(按照POSIX的说法, 程序员不应该倚赖所期望的顺序, 否则会被顺序竞争所困扰, 或者说程序员必须保证程序自身不发生顺序竞争问题)
进而导致那个usleep(100000);不可以去掉

在FreeBSD上这个程序执行的更是一蹋糊涂, 以至于要达到程序字面的效果,
需要设置互斥量和条件变量的初始化参数(因为LINUX和FREEBSD的初始化默认行为完全不同)

论坛徽章:
0
4 [报告]
发表于 2009-02-11 18:39 |只看该作者

回复 #1 safedead 的帖子

#include <iostream>
#include <vector>
#include <Thread>
using namespace Traxex;
using namespace std;

vector< Thread*> threads;
vector< Cond*>   conds;

void fun( int id){
    while(true){
        conds[id]->wait();
        std::cout << "signal " << id << std::endl;
    }
}
int main(){

    for( int i = 0; i < 10; ++i){
        threads.push_back(new Thread( &fun, i));
        conds.push_back( new Cond());
        threads->start();
    }

    uint i;
    while( cin >> i){
        if( i <= conds.size()){
            conds->signal();
        }
    }
}

_______________________________
$ make
g++ -c -O2 -Wall   -I. -I../include/ -I../  -o condtest.o condtest.cpp
g++  -o ct Thread.o condtest.o -lpthread
$ ./ct
2
signal 2
4
signal 4
5
signal 5
7
signal 7
9
signal 9
0
signal 0
22
3
signal 3
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP