TCL通讯:
问 :请设计一段程序,使用三个线程,一个线程对num加一并输出余2后的值,一个线程对num加一并输出余3后的值。一个线程检测num是否大于5,如果大于则关闭所有线程。
C++11提供了多线程和并发编程的支持,但这方面需要的知识我还是需要看看《C++并发编程实战》一书,掌握这方面的能力看来并非易事。
这段程序我个人认为是有问题的,希望路过的大佬们给点意见。题目要求在另一个线程里检测num是否大于5并控制其他线程的关闭,但有两个问题:①在另一个线程中直接控制其他线程的关闭(使用TerminateThread()函数)会让线程立即关闭,会导致内存泄漏和死锁问题,所以这里用的是一个全局的flag标志位去让其他线程自行判断是否应该退出,但符不符合题意是个问题。②因为线程调度由操作系统控制,会出现num等于7或者8的情况线程才全部退出。
/**
* 华南农业大学 杨帮杰 2019.10.13
* References:
* https://www.jianshu.com/p/34d219380d90
* https://www.cnblogs.com/huty/p/8516997.html
* https://blog.csdn.net/yimengchenxi/article/details/46691981
*/
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
volatile int m_num = 0;
volatile bool m_extFlag = false;
mutex mtx;
int main()
{
thread th1([&] {
while (m_extFlag !=true)
{
//不推荐使用ExitThread()来退出
//不会调用作用域内类对象的析构函数
if (m_extFlag == true)
return;
//互斥锁的几种用法
//mtx.lock();
//unique_lock<mutex> lck(mtx);
lock_guard<mutex> lck(mtx);
m_num++;
cout << "threa1-m_num = " << m_num << endl;
cout << "m_num % 2 = " << m_num % 2 << endl;
//mtx.unlock();
}
});
thread th2([&] {
while (true)
{
if (m_extFlag == true)
return;
//mtx.lock();
lock_guard<mutex> lck(mtx);
m_num++;
cout << "threa2-m_num = " << m_num << endl;
cout << "m_num % 3 = " << m_num % 3 << endl;
//mtx.unlock();
}
});
thread th3([&] {
//不推荐在其他线程使用TerminateThread()
//会导致堆栈没有被回收,内存泄漏或死锁
while (m_num <= 5);
m_extFlag = true;
});
th1.join();
th2.join();
th3.join();
system("pause");
return 0;
}
num=7时才停下来?
问:以下程序的输出结果如何?
答案是false和true。虽然字符数组和字符指针一定程度上可以互相转换使用,但要意识到这两者其实是两种类型。字符数组在栈区开辟,而拿数组名去比较的时候退化成指针(地址),显然两个字符数组的地址是不一样的。
char* strPointer1 = "abc";这种写法实质在C++11标准是被禁止的,正确的写法是 const char* strPointer1 = "abc";因为"abc"本身是常量。也就是说,使用char* str去指向一个常量的时候,这个变量指向的是常量区。编译器为了优化,指向同样常量的两个char* str指向的内存地址是一样的。
//Reference:https://blog.csdn.net/honyniu/article/details/51323255
#include <iostream>
using namespace std;
int main() {
char strArray1[] = "abc";
char strArray2[] = "abc";
cout << boolalpha << (strArray1 == strArray2) << endl;
char* strPointer1 = "abc";
char* strPointer2 = "abc";
cout << boolalpha << (strPointer1 == strPointer2 ) << endl;
}
深圳长城开发:
问:请写出一个链表逆序的过程。
https://blog.csdn.net/hbuxiaofei/article/details/36673043
当时傻乎乎地把head指向了NULL,其实应该指向最后一个。
//Reference:https://blog.csdn.net/a1037488611/article/details/40190211
#include "iostream"
using namespace std;
struct ListNode
{
int data;
ListNode *next;
};
void prt_linked_list(ListNode* head);
ListNode* reverse_linked_list(ListNode* head);
void main()
{
ListNode *head;
head=new ListNode;
head->data=-1;
head->next=NULL;
int x;
cin>>x;
ListNode *p,*q;
p=head;
while(x!=-1)
{
q=new ListNode;
q->data=x;
q->next=NULL;
p->next=q;
p=q;
cin>>x;
}
prt_linked_list(head);
head=reverse_linked_list(head);
prt_linked_list(head);
}
void prt_linked_list(ListNode* head)
{
ListNode *p;
p=head->next;
while(p!=NULL)
{
cout<<p->data;
cout<<" ";
p=p->next;
}
}
ListNode* reverse_linked_list(ListNode* head)
{
ListNode *p,*q;
ListNode *t = NULL;
p=head;
if (p->next==NULL||p->next->next==NULL)
{
return head;
}
p=head->next;
q=head->next->next;
while(q!=NULL)
{
t=q->next;
q->next=p;
p=q;
q=t;
}
head->next->next=NULL;
head->next=p;
return head;
}
问:机器视觉系统的主要组成部分有哪些?
机器视觉算法与应用 P2 图工业相机、光源、(触发图像采集的光电传感器)、计算机、图像采集卡、工业相机驱动软件、机器视觉软件算法、PLC/下位机、现场总线(CAN/ModBus等)、执行机构(电机/机械臂等)
大华:
问:写一段程序,判断计算机是大端还是小端处理器。
可以用一个char*指针来指向一个int变量的方式来判断
大小端区别
#include <iostream>
using namespace std;
int main()
{
int i = 0x12345678;
if (*((char*)&i) == 0x12)
cout << "大端" << endl;
else
cout << "小端" << endl;
return 0;
}
问:Linux进程一共有几种状态?
一般认为是五种
https://blog.csdn.net/qq_38410730/article/details/81173170
//https://blog.csdn.net/yanlinwang/article/details/8193709
//关于进程的几个状态值在sched.h中定义如下
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 3
#define TASK_STOPPED 4
网友评论