设为首页 收藏本站
查看: 926|回复: 0

[经验分享] c++辅助python实现多线程(条件变量)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-5-4 09:38:08 | 显示全部楼层 |阅读模式
程序很简单,主要是熟悉一下c++和python的编程,然后那个条件变量的使用花了点时间,主要是以前没用过.

主要用途想以后建立个线程池非阻塞的调用sql.

#include <pthread.h>
#include <signal.h>
#include <errno.h>
#include "Python.h"

//加载时初始化和卸载时清理
void __attribute__ ((constructor)) my_init(void);
void my_fini(void) __attribute__((destructor));
#define GIGNAL_BEGIN (SIGUSR1+1)
#define GIGNAL_FINISH (SIGUSR1+2)

pid_t pid;
int value;
int is_begin = 0, is_end = 0;
pthread_mutex_t mutex;
pthread_cond_t cond;
void *func(void *args)
{
    int *r = args, i = 0;
    printf("in func");
    while(1)
    {
        pthread_mutex_lock(&mutex);
        while(!is_begin)
        {
             pthread_cond_wait(&cond, &mutex);
        }
        is_begin = 0;
        pthread_mutex_unlock(&mutex);
        *r = i++;
        pthread_mutex_lock(&mutex);
        is_end = 1;
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);
    }
    return (void *)0;
}


void my_init(void)
{
    int err;
    if((err = pthread_create(&pid, NULL, func, &value)) != 0)
    {
        printf("errno=%d\n",err);
    }
    pthread_mutex_init(&mutex, NULL);
    return;
}

int increase()
{
    pthread_mutex_lock(&mutex);
    is_begin = 1;
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&mutex);
    pthread_mutex_lock(&mutex);
    while(!is_end)
    {
        pthread_cond_wait(&cond, &mutex);
    }
    is_end = 0;
    pthread_mutex_unlock(&mutex);
    return value;
}

static PyObject* wrap_increase(PyObject *self, PyObject *args)
{

    int result = increase();
    //把得到的结果包装成Python对象,并返回

    return (PyObject*)Py_BuildValue("i", result);
}

void my_fini(void)
{
    pthread_mutex_destroy(&mutex);
    return;
}

int add(int arg1, int arg2)
{
    return arg1 + arg2;
}

static PyObject* wrap_add(PyObject *self, PyObject *args)
{
    //把输入的Python对象转换为C/C++能识别的数据

    int arg1, arg2;
    if(!PyArg_ParseTuple(args, "ii", &arg1, &arg2))
    return NULL;
    //调用C/C++函数,得到结果

    int result = add(arg1,arg2);
    //把得到的结果包装成Python对象,并返回

    return (PyObject*)Py_BuildValue("i", result);
}



static PyMethodDef wrap_methods[] ={
    {"add", wrap_add, METH_VARARGS, "求和"},//函数名(调用),函数地址,参数类型,函数说明
    {"increase", wrap_increase, METH_VARARGS, "求和"},
    {NULL, NULL}
};

//入口看书,init后必须跟模块的名字
void initwrap (void)
{
    Py_InitModule("wrap", wrap_methods);
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372810-1-1.html 上篇帖子: python oss alioss 使用阿里开放云存储服务 下篇帖子: 零基础学python-模块的导入与重载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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