1e41f4b71Sopenharmony_ci# CommonLibrary Subsystem Changelog
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci## cl.commonlibrary.1 Behavior for the Task Pool to Transfer Sendable Data Is Changed
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci**Access Level**
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ciOther
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci**Change Reason**
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ciThe task pool is used to execute concurrent tasks. If Sendable data is directly returned in a call or the **sendData** API is called for data transmission, the default transmission mode of the Sendable data is changed from clone to shared. This change is because the data is seldom used after the task in the task pool is executed.
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci**Change Impact**
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ciThis change is a non-compatible change.
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ciBefore the change, when **taskpool.Task.sendData** of API version 11 is used to send or directly return Sendable data, one copy is made by default.
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ciAfter the change, Sendable data is shared in this scenario. If the data is modified in the host thread, the subthread gets notified. However, the task pool is executed by task. There is a low probability that simultaneous operations are performed on the same object, and the impact of subsequent data changes on the task pool is controllable.
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ciIn the following code, the printed value may be 100 or changed to 200 by the subthread:
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci```
24e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS'
25e41f4b71Sopenharmony_ci@Sendable
26e41f4b71Sopenharmony_ciclass A {
27e41f4b71Sopenharmony_ci    num: number = 100
28e41f4b71Sopenharmony_ci}
29e41f4b71Sopenharmony_ci@Concurrent
30e41f4b71Sopenharmony_ciasync function foo(a: A) {
31e41f4b71Sopenharmony_ci    taskpool.Task.sendData(a)
32e41f4b71Sopenharmony_ci    a.num = 200
33e41f4b71Sopenharmony_ci}
34e41f4b71Sopenharmony_cilet a: A = new A()
35e41f4b71Sopenharmony_cilet task = new taskpool.Task(foo, a)
36e41f4b71Sopenharmony_citask.onReceiveData((val: A) => {
37e41f4b71Sopenharmony_ci    console.log("num: " + val.num)
38e41f4b71Sopenharmony_ci})
39e41f4b71Sopenharmony_ci```
40e41f4b71Sopenharmony_ci
41e41f4b71Sopenharmony_ci**Start API Level**
42e41f4b71Sopenharmony_ci
43e41f4b71Sopenharmony_ciAPI version 11
44e41f4b71Sopenharmony_ci
45e41f4b71Sopenharmony_ci**Change Since**
46e41f4b71Sopenharmony_ci
47e41f4b71Sopenharmony_ciOpenHarmony SDK 5.0.0.18
48e41f4b71Sopenharmony_ci
49e41f4b71Sopenharmony_ci**Key API/Component Changes**
50e41f4b71Sopenharmony_ci
51e41f4b71Sopenharmony_ciN/A
52e41f4b71Sopenharmony_ci
53e41f4b71Sopenharmony_ci**Adaptation Guide**
54e41f4b71Sopenharmony_ci
55e41f4b71Sopenharmony_ciIf **sendData** is not executed in the task pool or the read and write operations on the same attribute are performed by two independent threads after data is returned, no adaptation is required.
56e41f4b71Sopenharmony_ci
57e41f4b71Sopenharmony_ciIf **sendData** is executed in the task pool or the host thread and its subthread read and write the same attribute after data is returned, a lock must be used (imported from @arkts.utils).
58e41f4b71Sopenharmony_ci
59e41f4b71Sopenharmony_ciCurrent code:
60e41f4b71Sopenharmony_ci
61e41f4b71Sopenharmony_ci```
62e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS'
63e41f4b71Sopenharmony_ci@Sendable
64e41f4b71Sopenharmony_ciclass A {
65e41f4b71Sopenharmony_ci    num: number = 100
66e41f4b71Sopenharmony_ci}
67e41f4b71Sopenharmony_ci@Concurrent
68e41f4b71Sopenharmony_ciasync function foo(a: A) {
69e41f4b71Sopenharmony_ci    taskpool.Task.sendData(a)
70e41f4b71Sopenharmony_ci    a.num = 200
71e41f4b71Sopenharmony_ci}
72e41f4b71Sopenharmony_cilet a: A = new A()
73e41f4b71Sopenharmony_cilet task = new taskpool.Task(foo, a)
74e41f4b71Sopenharmony_citask.onReceiveData((val: A) => {
75e41f4b71Sopenharmony_ci    console.log("num: " + val.num)
76e41f4b71Sopenharmony_ci})
77e41f4b71Sopenharmony_ci```
78e41f4b71Sopenharmony_ciTo ensure the thread safety of the **num** domain of class A, synchronization protection is required. The recommended code snippet is as follows:
79e41f4b71Sopenharmony_ci```
80e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS'
81e41f4b71Sopenharmony_ci@Sendable
82e41f4b71Sopenharmony_ciclass A {
83e41f4b71Sopenharmony_ci    num: number = 100
84e41f4b71Sopenharmony_ci    async setNum(num: number) {
85e41f4b71Sopenharmony_ci        // add lock here
86e41f4b71Sopenharmony_ci        this.num = num
87e41f4b71Sopenharmony_ci    }
88e41f4b71Sopenharmony_ci    async getNum(): Promise<number> {
89e41f4b71Sopenharmony_ci        // add lock here
90e41f4b71Sopenharmony_ci        return this.num
91e41f4b71Sopenharmony_ci    }
92e41f4b71Sopenharmony_ci}
93e41f4b71Sopenharmony_ci@Concurrent
94e41f4b71Sopenharmony_ciasync function foo(a: A) {
95e41f4b71Sopenharmony_ci    taskpool.Task.sendData(a)
96e41f4b71Sopenharmony_ci    a.setNum(200)
97e41f4b71Sopenharmony_ci}
98e41f4b71Sopenharmony_cilet a: A = new A()
99e41f4b71Sopenharmony_cilet task = new taskpool.Task(foo, a)
100e41f4b71Sopenharmony_citask.onReceiveData((val: A) => {
101e41f4b71Sopenharmony_ci    console.log("num: " + val.getNum())
102e41f4b71Sopenharmony_ci})
103e41f4b71Sopenharmony_ci```
104e41f4b71Sopenharmony_ci
105e41f4b71Sopenharmony_ci
106e41f4b71Sopenharmony_ci## cl.commonlibrary.2 taskId in taskInfos Obtained by Calling taskpool.getTaskPoolInfo Is Changed from BigInt to Number
107e41f4b71Sopenharmony_ci
108e41f4b71Sopenharmony_ci**Access Level**
109e41f4b71Sopenharmony_ci
110e41f4b71Sopenharmony_ciOther
111e41f4b71Sopenharmony_ci
112e41f4b71Sopenharmony_ci**Change Reason**
113e41f4b71Sopenharmony_ci
114e41f4b71Sopenharmony_ci**taskId** of the number type is sufficient for use.
115e41f4b71Sopenharmony_ci
116e41f4b71Sopenharmony_ci**Change Impact**
117e41f4b71Sopenharmony_ci
118e41f4b71Sopenharmony_ciThis change is a non-compatible change.
119e41f4b71Sopenharmony_ci
120e41f4b71Sopenharmony_ciBefore the change, the **taskId** type is BigInt.
121e41f4b71Sopenharmony_ci
122e41f4b71Sopenharmony_ciAfter the change, the **taskId** type is number. **taskId** is a member of **TaskInfo** in the **TaskPoolInfo** class obtained through **taskpool.getTaskPoolInfo**. The change of the member type does not affect other attributes obtained using **taskpool.getTaskPoolInfo**. The change has little impact on developers.
123e41f4b71Sopenharmony_ci
124e41f4b71Sopenharmony_ciCurrent code:
125e41f4b71Sopenharmony_ci```ts
126e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS'
127e41f4b71Sopenharmony_ci
128e41f4b71Sopenharmony_ci@Concurrent
129e41f4b71Sopenharmony_cifunction delay(): void {
130e41f4b71Sopenharmony_ci  let start: number = new Date().getTime();
131e41f4b71Sopenharmony_ci  while (new Date().getTime() - start < 500) {
132e41f4b71Sopenharmony_ci    continue;
133e41f4b71Sopenharmony_ci  }
134e41f4b71Sopenharmony_ci}
135e41f4b71Sopenharmony_ci
136e41f4b71Sopenharmony_cilet task1: taskpool.Task = new taskpool.Task(delay);
137e41f4b71Sopenharmony_cilet task2: taskpool.Task = new taskpool.Task(delay);
138e41f4b71Sopenharmony_cilet task3: taskpool.Task = new taskpool.Task(delay);
139e41f4b71Sopenharmony_citaskpool.execute(task1, taskpool.Priority.LOW)
140e41f4b71Sopenharmony_citaskpool.execute(task2, taskpool.Priority.MEDIUM)
141e41f4b71Sopenharmony_citaskpool.execute(task3, taskpool.Priority.HIGH)
142e41f4b71Sopenharmony_cilet start: number = new Date().getTime();
143e41f4b71Sopenharmony_ciwhile (new Date().getTime() - start < 1000) {
144e41f4b71Sopenharmony_ci  continue;
145e41f4b71Sopenharmony_ci}
146e41f4b71Sopenharmony_cilet taskpoolInfo: taskpool.TaskPoolInfo = taskpool.getTaskPoolInfo();
147e41f4b71Sopenharmony_cilet taskId: number = 0;
148e41f4b71Sopenharmony_cilet taskIS = Array.from(taskpoolInfo.taskInfos)
149e41f4b71Sopenharmony_cifor(let taskInfo of taskIS) {
150e41f4b71Sopenharmony_ci  taskId = taskInfo.taskId;
151e41f4b71Sopenharmony_ci  console.info("taskpool---taskId is:" + taskId);
152e41f4b71Sopenharmony_ci}
153e41f4b71Sopenharmony_ci```
154e41f4b71Sopenharmony_ci
155e41f4b71Sopenharmony_ci**Start API Level**
156e41f4b71Sopenharmony_ci
157e41f4b71Sopenharmony_ciAPI version 11
158e41f4b71Sopenharmony_ci
159e41f4b71Sopenharmony_ci**Change Since**
160e41f4b71Sopenharmony_ci
161e41f4b71Sopenharmony_ciOpenHarmony SDK 5.0.0.18
162e41f4b71Sopenharmony_ci
163e41f4b71Sopenharmony_ci**Key API/Component Changes**
164e41f4b71Sopenharmony_ci
165e41f4b71Sopenharmony_citaskpool.getTaskPoolInfo
166e41f4b71Sopenharmony_ci
167e41f4b71Sopenharmony_ci**Adaptation Guide**
168e41f4b71Sopenharmony_ci
169e41f4b71Sopenharmony_ciDefine the **taskId** type as number.
170