linux C语言的锁机制

linux C语言的锁机制,第1张

你写错了

#include <stdio.h>

#include <stdlib.h>

#include<unistd.h>

#include<sys/types.h>

#include <fcntl.h>

int main(void)

{

int fd1=0,fd2=0

int output

output=open("/root/647.txt", O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR)

if( (fd1=fork() )==0)

{

lockf(output, 1, 0)

write(output,"fd1\n",4)

sleep(2)

write(output,"fd1\n",4)

lockf(output, 0, 0)

}

else if( (fd2=fork() )==0)

{

lockf(output, 1, 0)

write(output,"fd2\n",4)

sleep(2)

write(output,"fd2\n",4)

lockf(output, 0, 0)

}

else

{

lockf(output, 1, 0)

write(output,"fd\n",3)

sleep(2)

write(output,"fd\n",3)

lockf(output, 0, 0)

}

return 0

}

结果为

fd

fd

fd2

fd2

fd1

fd1

让我来告诉你答案!设置状态变量lock=0,在占用资源的函数中,设置lock=1;并在处理结束后设lock=0.

比如:

boollock=0

intscan()

{

while(lock!=0)//循环检测,直到资源释放才执行下面的语句

lock=1//锁定资源

...//具体的执行扫描的语句

lock=1//释放资源

return0

}

这个方法容易实现,但是占用CPU,假定其他线程正在占用扫描仪,那么这个线程就会在自己的时间片内不停的执行while语句直到对方释放扫描仪。由此造成了浪费。

现在流行的做法是通过中断信号来做,那是一本书的内容,建议看linux内核编程方面的书。

首先需要安装boost,步骤如下:

下载到 boost_1_49_0.tar.bz2 (当然,其他压缩格式也可以)后,可以把它放在用户目录下,即:~/

解压缩:tar -jxvf boost_1_49_0.tar.bz2

这样,出现文件夹:~/boost_1_49_0

然后进入:$ cd boost_1_49_0

你会发现有一�¸.sh命令:bootstrap.sh

运行它:$ ./bootstrap.sh     (boost自己的get start文档中说设置参数 --prefix=dir 其中dir为你想指定的安装文件夹,我建议就不用加这个参数,它会默认安装到/usr/local)

结束后出现一个可执行文件: ~/boost_1_49_0/b2

运行这个文件: $ sudo ./b2 install   (Ubuntu用户千万别忘了加sudo,不然安装后将无法完全使用)

编译安装时间比较长,根据不同机器的情况20~40分钟。结束后即安装完毕。

boost::thread的使用

#include <boost/thread.hpp>

#include <iostream>

void task1() { 

    // do stuff

    std::cout << "This is task1!" << std::endl

}

void task2() { 

    // do stuff

    std::cout << "This is task2!" << std::endl

}

int main (int argc, char ** argv) {

    using namespace boost 

    thread thread_1 = thread(task1)

    thread thread_2 = thread(task2)

    // do other stuff

    thread_2.join()

    thread_1.join()

    return 0

}

编译时的命令为:

$ g++ -I./inlcude -L./lib example.cpp -lboost_thread -o example

编译之后会出现一个 example 的可执行文件,可以运行:./example , 结果显示:

This is task2!

This is task1!

可能你在运行时会出现这样的错误:error while loading shared libraries: libboost_thread.so.1.49.0: cannot open shared object file: No such file or directory

这是因为要用到的库不在默认的环境变量里,可以使用下面的命令添加:

$ sudo ldconfig /usr/local/lib

添加后,再执行./example,这样你就完成了你的第一个boost::thread程序。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/6236662.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-18
下一篇2023-03-18

发表评论

登录后才能评论

评论列表(0条)

    保存