linux 下多线程错误 undefined reference to `sem_init'_undefined reference to `sem_post-程序员宅基地

技术标签: Linux/Ubuntu/Fedora  

原文地址::http://www.cnblogs.com/stli/archive/2010/03/11/1683823.html


undefined reference to `sem_init'
undefined reference to `sem_post'
undefined reference to `sem_wait'

编译选项需要加入一个多线程

gcc -pthread -o outfile.out filename.c

[source code]

#include "sched.h"
#include "pthread.h"
#include "stdio.h"
#include "stdlib.h"
#include "semaphore.h"
int producer(void * args);
int consumer(void * args);
pthread_mutex_t mutex;
sem_t product;
sem_t warehouse;
char buffer[8][4];
int bp=0;
int main(int argc,char * * argv)
{
pthread_mutex_init(& mutex,NULL);
sem_init(& product,0,0);
    sem_init(& warehouse,0,8);
int clone_flag,arg,retval;
    char * stack;
    clone_flag=CLONE_VM | CLONE_SIGHAND | CLONE_FS | CLONE_FILES;
    int i;
for(i=0;i<2;i++)
{ //创建四个线程
        arg=i;
        stack=(char *)malloc(4096); 
        retval=clone((void *)producer,& (stack[4095]),clone_flag,(void *) & arg);
   stack=(char *)malloc(4096); 
        retval=clone((void *)consumer,& (stack[4095]),clone_flag,(void *) & arg);
    }
    exit(1);
return 0;
}
int producer(void * args)
{
    int id = *((int *)args);
    int i;
    for(i=0;i<10;i++)
    {
   sleep(i+1); //表现线程速度差别
        sem_wait(&warehouse);
        pthread_mutex_lock(&mutex);
        if(id==0)
            strcpy(buffer[bp],"aaa\0");
        else
            strcpy(buffer[bp],"bbb\0");
        bp++;
        printf("producer%d produce %s in %d\n",id,buffer[bp],bp-1);
        pthread_mutex_unlock(&mutex);
        sem_post(&product);
    }
    printf("producer%d is over!\n",id);
}
int consumer(void * args)
{
    int id = * ((int *)args);
    int i;
    for(i=0;i<10;i++)
    {
        sleep(10-i); //表现线程速度差别
        sem_wait(&product);
        pthread_mutex_lock(&mutex);
        bp--;
        printf("consumer%d get %s in%d\n",id,buffer[bp],bp+1);
        strcpy(buffer[bp],"zzz\0");
        pthread_mutex_unlock(&mutex);
        sem_post(&warehouse);
    }
    printf("consumer%d is over!\n",id);
}本文转自:http://hi.baidu.com/luosiyong/blog/item/e5e1980fffd1b6e5ab6457e5.html


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xqhrs232/article/details/72357501

智能推荐

计算机二级vb上机题,2017年9月计算机二级VB上机操作练习题及答案-程序员宅基地

文章浏览阅读114次。2017年9月计算机二级VB上机操作练习题及答案引导语:从任何标准来说,VB都是世界上使用人数最多的语言,为了帮助大家准备计算机二级VB考试,以下是yjby小编分享给大家的2017年9月计算机二级VB上机操作练习题及答案,欢迎练习,更多精彩内容请持续关注我们应届毕业生考试网!一、基本操作题(1)在名称为Forml、标题为“球类项目”且没有最大化和最小化按钮的窗体上画1个名称为Combol的组合框。..._vb上机操作要求: 第一题:界面如下图,让计算机随机产生50—100的随机整数,请学生猜

邵阳学院计算机系主任,邵阳学院-程序员宅基地

文章浏览阅读165次。主要教学科研成果:主要从事数学分析、泛函分析、数值分析、计算机网络、数字图像处理等课程的教学。科研上2002年前致力于应用泛函分析的研究,比较系统地解决了半线性椭圆方程Dirchelt边值问题的研究工作,2003年后致力于数字图像处理的研究。已在国内外重要刊物发表学术论文20余篇,其中有5篇论文被国际三大检索SCI、EI检索,有10篇被美国数学评论(MR)评论;已参与完成国家自然科研基金项目2项,..._邵阳学院计算机系领导名单

java.sql.SQLException: Can not issue data manipulation statements with executeQuery()._jpa 注解写原生sql 一直提示can not issue data manipulation s-程序员宅基地

文章浏览阅读1k次。delete update inserte 都是要加 @Transactional @Modifying(clearAutomatically = true)进行insert,delete,update操作的时候使用了excecuteQuery()方法,而不是excecuteUpdate()方法_jpa 注解写原生sql 一直提示can not issue data manipulation statements with ex

L293/L293d使用总结_l293d引脚图及功能-程序员宅基地

文章浏览阅读9.9k次,点赞5次,收藏20次。L293 L293d 应用总结_l293d引脚图及功能

innobackupex全量备份+增量备份手记_innobackupex 远程增量-程序员宅基地

文章浏览阅读862次。全量备份查库[root@localhost ~]# service mysqld5612 status[root@localhost ~]# mysql -uroot -prootmysql> select * from t1.test1;+------+| id |+------+| 1 || 2 || 3 |+------+3 rows in set (_innobackupex 远程增量

ConnectivityService框架初识-程序员宅基地

文章浏览阅读1.6w次,点赞10次,收藏96次。Android中提供的数据业务方式有几种:移动数据网络,WIFI,热点,网线等。这些数据业务本身可以独立使用,但是同一时刻,只能使用其中的一种数据业务方式。管理这些数据业务方式的使用由ConnectivityService,NetworkFactory,NetworkAgent,NetworkMonitor等来完成,ConnectivityService处于核心调度位置。ConnectivitySe_connectivityservice

随便推点

pyd包导入报ModuleNotFoundError: No module named_pyd no moudle-程序员宅基地

文章浏览阅读258次。在windows环境下确保运行环境python版本与pyd版本一致。_pyd no moudle

单元测试框架-Unittest-程序员宅基地

文章浏览阅读805次,点赞24次,收藏20次。framework,框架指的是为了解决一个或者是一类问题而开发的产品,用户一般只需要调用框架所提供的类或函数,就可以实现它所定义的功能,从这个角度理解unittest框架,它主要实现了测试用例的组织与执行,以及测试结果的生成。首先,单元测试的编写没有一定的规范可遵循,不同的人写出来的测试程序可能不同,不统一的代码维护起来很麻烦。(4)使用unittest组织的单元测试里,可以自动执行的方法有:setUp(),tearDown(),以test打头的方法,除此之外的其他方法,例如a,b等,不会自动执行。

树莓派桌面远程访问_树莓派怎么远程桌面-程序员宅基地

文章浏览阅读909次。树莓派桌面远程访问方法一:VNC远程连接树莓派工具:VNC Viewer开启系统,在命令行输入:sudo raspi-config选择第五项Interfacing Options选择第三项VNC打开VNC Viewer工具,输入树莓派IP输入用户名:pi 密码:raspberry成功访问树莓派桌面问题解决:第一次进行上面操作的时候可能会遇到下面这样的情况在输入用户名和密码后,屏幕出现cannot currently show the desktop,百度查了一下。发现_树莓派怎么远程桌面

计算机视觉——【tensorflow入门】基于tensorflow框架的模型参数保存、重载及输出_tensorflow模型参数输出-程序员宅基地

文章浏览阅读1.3k次。基于tensorflow框架的模型参数保存、重载及输出编程语言:Python3.5框架采用:Tensorflow-gpu = 1.1.0在训练模型过程中不免会遇到需要存储模型参数的情况,在tensorflow框架下提供和Saver.save()函数来保存参数,保存的对象包括:权重及在程序中定义的变量,不包含图结构,保存的文件为checkpoint 文件。代码示例:变量..._tensorflow模型参数输出

re:从0开始的HTML学习之路 1. 标签间的关系与注释-程序员宅基地

文章浏览阅读347次,点赞12次,收藏11次。我们可以用记事本写一个如下的HTML文件,如

log4j、log4j2、slf4j、logback的使用_slf4j和log4j2依赖配置-程序员宅基地

文章浏览阅读126次。注意:slf4j + log4j2的适配器已经推荐使用 log4j-slf4j2-impl,而不是log4j-slf4j-impl。如果使用log4j-slf4j-impl,报如下错的话,说明你是slf4j 版本过高。_slf4j和log4j2依赖配置

推荐文章

热门文章

相关标签