Linux 进程 唯一,linux pthread线程相关,只运行唯一进程相关

#include #include#include#include#include#include#include#include#include#include#include#include

using namespacestd;

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;int count_value = 0;void * MyFunc(void *arg)

{if(arg ==NULL)

{

printf("param is not allow NULL.\n");returnNULL;

}//加锁--所有线程都能访问的全局变量加锁

pthread_mutex_lock(&mutex);int *pnumx = (int*) arg;int i = 0;while(i < 1000)

{

printf("thread%d count=%d\n", *pnumx, count_value++);

sleep(1);

i++;

}

pthread_mutex_unlock(&mutex);returnNULL;

}void * MyFunc2(void *arg)

{if (arg ==NULL)

{

printf("param is not allow NULL!\n");returnNULL;

}//这个锁和myfunc中的锁是同一个锁,myfunc被锁,这里也会被锁

pthread_mutex_lock(&mutex);int * pnumx = (int *) arg;int i = 0;while (i < 1000)

{

printf("thread%d count=%d\n", *pnumx, count_value++);

sleep(1);

i++;

}//解锁

pthread_mutex_unlock(&mutex);returnNULL;

}//Already running return true.

boolIsSingleProcess ()

{int no_os_flag=1;

#ifdef linux

no_os_flag=0;

std::cout<

no_os_flag=0;

std::cout<

no_os_flag=0;

std::cout<

no_os_flag=0;

std::cout<

if(1==no_os_flag){

std::cout<

}long pid = 0;char full_name[1024] = {0};char proc_name[1024] = {0};intfd;

pid=getpid();

std::cout<< "pid =" << pid << " ";

sprintf(full_name,"/proc/%ld/cmdline", pid);if (access(full_name, F_OK) == 0)

{

fd=open (full_name, O_RDONLY);if (fd == -1)return false;

read (fd, proc_name,1024);

close (fd);

}else

return false;char self_proc_name[512] = {0};char * p =proc_name;int pt = 0;while (*p != ' ' && *p != '\0')

{

self_proc_name[pt]= *p;

p++;

pt++;

}string self_final_name =basename(self_proc_name);

std::cout<< "self_final_name =" << self_final_name << std::endl <

DIR*dir;struct dirent *result;

dir= opendir ("/proc");while ((result = readdir (dir)) !=NULL)

{if (! strcmp(result->d_name, ".") || ! strcmp (result->d_name, "..") || ! strcmp (result->d_name, "thread-self")|| ! strcmp (result->d_name, "self") || atol (result->d_name) ==pid)continue;

memset(full_name,0, sizeof(full_name));

memset(proc_name,0, sizeof(proc_name));

sprintf(full_name,"/proc/%s/cmdline", result->d_name);if (access(full_name, F_OK) == 0)

{

fd=open (full_name, O_RDONLY);if (fd == -1)continue;

read (fd, proc_name,1024);

close (fd);char *q =proc_name;

pt= 0;

memset(self_proc_name,0, sizeof(self_proc_name));while (*q != ' ' && *q != '\0')

{

self_proc_name[pt]= *q;

q++;

pt++;

}string other_final_name =basename(self_proc_name);if (self_final_name ==other_final_name)

{

cout<< "full_name =" << full_name << endl <

cout<< "other_final_name:" << other_final_name <

}

}

}return false;

}int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);//condition compile

#ifdef _WIN32if(true ==IsSingleProcess())

{

std::cout<< "process is running in another place" << endl <

}#else

if(true == IsSingleProcess()) //Already running return true.

{

std::cout<< "......"<

}#endifcout<

pthread_t thr1,thr2;

pthread_attr_t attr;

pthread_attr_init(&attr);//设置进程为可分离状态

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);int aa = 1, bb = 2;//创建线程

if (pthread_create(&thr1, &attr, MyFunc, &aa) != 0)

{

printf("create thread is failed ! error message :%s\n",

strerror(errno));return -1;

}//释放进程属性对象

pthread_attr_destroy(&attr);if (pthread_create(&thr2, NULL, MyFunc2, &bb) != 0)

{

printf("create thread is failed ! error message :%s\n",

strerror(errno));return -1;

}

pthread_join(thr2, NULL);

printf("main end\n");return 0;returna.exec();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值